From bdde2f2ff7db780652fe6ba7b8b002b97cf41daf Mon Sep 17 00:00:00 2001 From: chaselover Date: Sun, 18 Jul 2021 09:10:36 +0900 Subject: [PATCH 1/3] first --- .vscode/launch.json | 15 + .vscode/settings.json | 3 + 1002.py | 18 ++ 1010.py | 14 + "10430\354\227\260\354\202\260.py" | 12 + "10775\352\263\265\355\225\255.py" | 30 ++ ...14\353\261\203\352\260\234\354\210\230.py" | 10 + ...14\353\261\203\354\260\276\352\270\260.py" | 10 + ...54\353\246\254\354\227\206\354\235\264.py" | 57 ++++ ...74\354\265\234\353\214\200\353\241\234.py" | 15 + 10820.py | 19 ++ "10824\353\204\244\354\210\230.py" | 3 + ...51\355\206\240\353\246\254\354\226\274.py" | 8 + 10972.py | 21 ++ ...64\354\240\204\354\210\234\354\227\264.py" | 20 ++ ...50\353\223\240\354\210\234\354\227\264.py" | 7 + ...53\223\240\354\210\234\354\227\264_dfs.py" | 21 ++ ...25\354\235\270\355\225\230\352\270\260.py" | 13 + ...30\354\213\244\353\260\260\354\240\225.py" | 19 ++ ...\353\260\260\354\240\225_1\354\260\250.py" | 22 ++ ...0 \353\230\220\352\263\265\353\266\200.py" | 11 + ...4_\355\221\270\353\212\224\354\244\221.py" | 43 +++ 11052.py | 12 + ...00\353\266\204\354\210\230\354\227\264.py" | 19 ++ 11055LIS.py | 13 + ...44\353\245\264\353\247\211\354\210\230.py" | 15 + ...20\355\224\204\354\240\220\355\224\204.py" | 24 ++ ...55\224\204\354\240\220\355\224\204_bfs.py" | 19 ++ ...355\224\204\354\240\220\355\224\204_dp.py" | 10 + ...45\353\247\214\353\223\244\352\270\260.py" | 6 + 11437LCA.py | 57 ++++ 11576_baseconversion.py | 13 + ...70\354\210\230\353\266\204\355\225\264.py" | 8 + ...70\354\202\254\353\260\260\354\227\264.py" | 9 + ...CT\354\225\224\355\230\270\355\231\224.py" | 6 + 11722LDS.py | 12 + ...24\354\206\214\352\260\234\354\210\230.py" | 26 ++ ...25\353\260\224\352\276\270\352\270\260.py" | 1 + 123game.py | 10 + 1260DFSBFS.py | 44 +++ ...\263\240\354\212\244\355\214\237_deque.py" | 27 ++ ...2\263\240\354\212\244\355\214\237_heap.py" | 27 ++ 13023ABCDE.py | 36 +++ ...98\354\227\260\354\206\215\355\225\251.py" | 21 ++ ...30\353\254\270\354\236\220\354\227\264.py" | 41 +++ ...0\353\260\224\352\274\255\354\247\2103.py" | 29 ++ ...25\353\260\224\352\276\270\352\270\260.py" | 1 + ...0\353\260\224\352\274\255\354\247\2104.py" | 32 ++ 14002LIS.py | 21 ++ ...0\354\275\230_\353\202\264\352\272\274.py" | 38 +++ ...0\355\213\260\354\275\230_\353\213\265.py" | 25 ++ ...05\354\235\264\354\241\260\352\260\201.py" | 47 +++ ...70\353\241\234\353\257\270\353\205\270.py" | 57 ++++ ...40\354\247\234\352\263\204\354\213\274.py" | 21 ++ ...70\354\231\200\353\247\201\355\201\254.py" | 32 ++ ...40\353\245\270\353\215\247\354\205\210.py" | 6 + ...64\353\270\214\353\237\254\353\246\254.py" | 7 + 15649NM(1).py | 17 ++ "15649NM(1)_2\355\212\270.py" | 15 + 15650NM(2).py | 15 + 15651NM(3).py | 14 + 15652NM(4).py | 14 + 15654NM(5).py | 19 ++ 15655NM(6).py | 18 ++ 15656NM(7).py | 15 + 15657NM(8).py | 14 + ...00\354\212\244\355\203\200\355\212\270.py" | 32 ++ 15663NM(9).py | 22 ++ 15664NM(10).py | 25 ++ 15665NM(11).py | 22 ++ 15666NM(12).py | 23 ++ 15988.py | 14 + ...23\353\215\224\355\225\230\352\270\260.py" | 21 ++ ... \353\215\224\355\225\230\352\270\2605.py" | 15 + ...4\353\247\244\355\225\230\352\270\2602.py" | 14 + ...\355\206\240\353\246\254\354\226\27490.py" | 2 + 16929two_Dots.py | 43 +++ ...00\354\236\245\353\260\251\354\213\235.py" | 36 +++ ...50\353\246\254\354\264\210\352\263\274.py" | 59 ++++ ...7\354\247\200\355\225\230\354\262\2402.py" | 52 ++++ ...7\354\247\200\355\225\230\354\262\2403.py" | 0 ...04\354\235\264\353\224\224\354\226\264.py" | 24 ++ ...61\354\210\230\354\235\230\355\225\251.py" | 12 + ...4_\352\267\270\353\236\230\355\224\204.py" | 46 +++ ...0\353\260\224\352\274\255\354\247\2106.py" | 24 ++ ...34\352\260\204\354\264\210\352\263\274.py" | 20 ++ ...70\352\263\240\354\275\224\353\223\234.py" | 23 ++ ...60\354\227\264\353\206\200\354\235\264.py" | 23 ++ ...\354\235\264_2\354\260\250\354\213\234.py" | 24 ++ ...51\354\235\230\355\221\234\355\230\204.py" | 35 +++ 17298.py | 44 +++ 17299.py | 8 + "17404RGB\352\261\260\353\246\2542.py" | 22 ++ 17413.py | 25 ++ ...64\354\226\264\354\223\260\352\270\260.py" | 26 ++ ...04\354\234\204\355\221\234\352\270\260.py" | 28 ++ ...14\354\210\230\354\260\276\352\270\260.py" | 14 + ...34\355\230\270\354\240\234\353\262\225.py" | 12 + ...04\355\221\234\352\270\260\354\213\235.py" | 33 +++ ...14\354\210\230\354\260\276\352\270\260.py" | 15 + "2004\354\241\260\355\225\251.py" | 18 ++ "2089_-2\354\247\204\354\210\230.py" | 18 ++ ...74\354\261\204\354\232\260\352\270\260.py" | 13 + ...70\353\241\234\355\203\220\354\203\211.py" | 25 ++ "2225\355\225\251\353\266\204\355\225\264.py" | 15 + ...\355\225\251\353\266\204\355\225\264re.py" | 12 + ...61\353\202\234\354\236\245\354\235\264.py" | 26 ++ ...\353\263\204\354\260\215\352\270\26010.py" | 32 ++ "2529\353\266\200\353\223\261\355\230\270.py" | 29 ++ ...65\354\225\275\352\263\265\353\260\260.py" | 16 + ...70\353\266\231\354\235\264\352\270\260.py" | 39 +++ ...70\354\235\264\354\236\254\352\270\260.py" | 5 + ...0 \353\230\220\352\263\265\353\266\200.py" | 12 + ...54\355\203\225\352\262\214\354\236\204.py" | 73 +++++ ...61\353\203\245\352\260\234\353\271\204.py" | 27 ++ 369game.py | 15 + 4446ROT12.py | 39 +++ ...54\235\230\352\260\234\354\210\230_bfs.py" | 35 +++ ...54\235\230\352\260\234\354\210\230_dfs.py" | 30 ++ ...50\353\223\234\353\260\224\355\235\220.py" | 23 ++ "6603\353\241\234\353\230\220.py" | 17 ++ "6603\353\241\234\353\230\220_DFS.py" | 21 ++ ...70\354\235\230\354\235\264\353\217\231.py" | 33 +++ "7576\355\206\240\353\247\210\355\206\240.py" | 45 +++ ...55\355\203\204\355\225\264\354\262\264.py" | 45 +++ "9465\354\212\244\355\213\260\354\273\244.py" | 16 + 9613GCD.py | 18 ++ "9613\343\205\216\343\205\212\343\205\207.py" | 0 ATM_beakjooon11399.py | 23 ++ CREATE TABLE MP_BOARD.http.txt | 8 + CREATE TABLE MP_BOARD.js | 8 + KCM_algorythm.py | 44 +++ ...9_\352\263\274\353\260\230\354\210\230.py" | 13 + ...60\354\236\220\354\241\260\355\225\251.py" | 32 ++ README.md.txt | 15 + .../lotto_numbering_module.cpython-38.pyc | Bin 0 -> 1426 bytes backtracking_DFS.py | 34 +++ beakjoon1006_dp.py | 16 + beakjoon1463.py | 22 ++ beakjoon1463_dp.py | 18 ++ beakjoon2839.py | 22 ++ beakjoon9095_dp.py | 32 ++ bfs.py | 74 +++++ bitsolved.py | 31 ++ calkin_wilf_tree1.py | 25 ++ color_fulling.py | 22 ++ color_mine.py | 22 ++ common_list_number.py | 22 ++ double_linkedList.py | 13 + find_str_replace_practice.py | 19 ++ hashtable2..py | 24 ++ infinity_dic.py | 25 ++ infinity_dic_pass.py | 22 ++ length_make_mountain.py | 18 ++ list_practice.py | 10 + list_subset_practice_later.py | 11 + local_global_practice.py | 19 ++ lotto_numbering_module.py | 23 ++ make_purple section_practice.py | 18 ++ map,filter,lambda,eval_practice.py | 50 ++++ mapping.py | 38 +++ max_min practce.py | 9 + meetingroom_beakjooon1931.py | 25 ++ nQueen.py | 16 + object_oriented_practice.py | 24 ++ paskal_triangle.py | 15 + patternMatching.py | 70 +++++ quickSoreted.py | 42 +++ score set_practice.py | 19 ++ score_aver,total_practice.py | 12 + snail_number.py | 22 ++ sugar_delievery2839.py | 13 + "tree\354\240\225\353\246\254.py" | 275 ++++++++++++++++++ using_lotto.py | 7 + ...60\353\212\245\352\260\234\353\260\234.py" | 33 +++ "\353\263\200\354\210\230\353\252\205.PNG" | Bin 0 -> 161670 bytes ...10\354\240\234\353\252\250\354\235\214.py" | 16 + ...70\354\202\254\353\260\260\354\227\264.py" | 9 + ...10\354\261\204\355\214\205\353\260\251.py" | 20 ++ 179 files changed, 4239 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 1002.py create mode 100644 1010.py create mode 100644 "10430\354\227\260\354\202\260.py" create mode 100644 "10775\352\263\265\355\225\255.py" create mode 100644 "10808\354\225\214\355\214\214\353\261\203\352\260\234\354\210\230.py" create mode 100644 "10809\354\225\214\355\214\214\353\261\203\354\260\276\352\270\260.py" create mode 100644 "10819\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254\354\227\206\354\235\264.py" create mode 100644 "10819\354\260\250\354\235\264\353\245\274\354\265\234\353\214\200\353\241\234.py" create mode 100644 10820.py create mode 100644 "10824\353\204\244\354\210\230.py" create mode 100644 "10872\355\214\251\355\206\240\353\246\254\354\226\274.py" create mode 100644 10972.py create mode 100644 "10973\354\235\264\354\240\204\354\210\234\354\227\264.py" create mode 100644 "10974\353\252\250\353\223\240\354\210\234\354\227\264.py" create mode 100644 "10974\353\252\250\353\223\240\354\210\234\354\227\264_dfs.py" create mode 100644 "10988\355\214\260\353\246\260\353\223\234\353\241\254\354\235\270\354\247\200 \355\231\225\354\235\270\355\225\230\352\270\260.py" create mode 100644 "11000\352\260\225\354\235\230\354\213\244\353\260\260\354\240\225.py" create mode 100644 "11000\352\260\225\354\235\230\354\213\244\353\260\260\354\240\225_1\354\260\250.py" create mode 100644 "11005\354\247\204\353\262\225\353\263\200\355\231\230_\353\202\230\354\244\221\354\227\220 \353\230\220\352\263\265\353\266\200.py" create mode 100644 "1102\353\260\234\354\240\204\354\206\214_\355\221\270\353\212\224\354\244\221.py" create mode 100644 11052.py create mode 100644 "11054\353\260\224\354\235\264\355\206\240\353\213\211\353\266\200\353\266\204\354\210\230\354\227\264.py" create mode 100644 11055LIS.py create mode 100644 "11057\354\230\244\353\245\264\353\247\211\354\210\230.py" create mode 100644 "11060\354\240\220\355\224\204\354\240\220\355\224\204.py" create mode 100644 "11060\354\240\220\355\224\204\354\240\220\355\224\204_bfs.py" create mode 100644 "11060\354\240\220\355\224\204\354\240\220\355\224\204_dp.py" create mode 100644 "1113\354\210\230\354\230\201\354\236\245\353\247\214\353\223\244\352\270\260.py" create mode 100644 11437LCA.py create mode 100644 11576_baseconversion.py create mode 100644 "11653\354\206\214\354\235\270\354\210\230\353\266\204\355\225\264.py" create mode 100644 "11656\354\240\221\353\257\270\354\202\254\353\260\260\354\227\264.py" create mode 100644 "1165RCT\354\225\224\355\230\270\355\231\224.py" create mode 100644 11722LDS.py create mode 100644 "11724\354\227\260\352\262\260\354\232\224\354\206\214\352\260\234\354\210\230.py" create mode 100644 "1212\354\247\204\353\262\225\353\260\224\352\276\270\352\270\260.py" create mode 100644 123game.py create mode 100644 1260DFSBFS.py create mode 100644 "1261\354\225\214\352\263\240\354\212\244\355\214\237_deque.py" create mode 100644 "1261\354\225\214\352\263\240\354\212\244\355\214\237_heap.py" create mode 100644 13023ABCDE.py create mode 100644 "13398\354\227\260\354\206\215\355\225\251.py" create mode 100644 "1342\355\226\211\354\232\264\354\235\230\353\254\270\354\236\220\354\227\264.py" create mode 100644 "13549\354\210\250\353\260\224\352\274\255\354\247\2103.py" create mode 100644 "1373\354\247\204\353\262\225\353\260\224\352\276\270\352\270\260.py" create mode 100644 "13913\354\210\250\353\260\224\352\274\255\354\247\2104.py" create mode 100644 14002LIS.py create mode 100644 "14226\354\235\264\353\252\250\355\213\260\354\275\230_\353\202\264\352\272\274.py" create mode 100644 "14226\354\235\264\353\252\250\355\213\260\354\275\230_\353\213\265.py" create mode 100644 "14391\354\242\205\354\235\264\354\241\260\352\260\201.py" create mode 100644 "14500\355\205\214\355\212\270\353\241\234\353\257\270\353\205\270.py" create mode 100644 "1476\353\202\240\354\247\234\352\263\204\354\213\274.py" create mode 100644 "14889\354\212\244\355\203\200\355\212\270\354\231\200\353\247\201\355\201\254.py" create mode 100644 "15552\353\271\240\353\245\270\353\215\247\354\205\210.py" create mode 100644 "15649(1)\354\210\234\354\227\264\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254.py" create mode 100644 15649NM(1).py create mode 100644 "15649NM(1)_2\355\212\270.py" create mode 100644 15650NM(2).py create mode 100644 15651NM(3).py create mode 100644 15652NM(4).py create mode 100644 15654NM(5).py create mode 100644 15655NM(6).py create mode 100644 15656NM(7).py create mode 100644 15657NM(8).py create mode 100644 "15661\353\247\201\355\201\254\354\231\200\354\212\244\355\203\200\355\212\270.py" create mode 100644 15663NM(9).py create mode 100644 15664NM(10).py create mode 100644 15665NM(11).py create mode 100644 15666NM(12).py create mode 100644 15988.py create mode 100644 "15988_123\353\215\224\355\225\230\352\270\260.py" create mode 100644 "15990 \353\215\224\355\225\230\352\270\2605.py" create mode 100644 "16194\354\271\264\353\223\234\352\265\254\353\247\244\355\225\230\352\270\2602.py" create mode 100644 "1676\355\214\251\355\206\240\353\246\254\354\226\27490.py" create mode 100644 16929two_Dots.py create mode 100644 "16929two_Dots_\354\235\264\354\240\204\352\260\222\354\240\200\354\236\245\353\260\251\354\213\235.py" create mode 100644 "16947\354\204\234\354\232\270\354\247\200\355\225\230\354\262\2402\355\230\270\354\204\240_\353\251\224\353\252\250\353\246\254\354\264\210\352\263\274.py" create mode 100644 "16947\354\247\200\355\225\230\354\262\2402.py" create mode 100644 "16947\354\247\200\355\225\230\354\262\2403.py" create mode 100644 "1697\354\210\250\353\260\224\352\274\255\354\247\210_\352\260\210\353\246\274\352\270\270 \355\203\220\354\203\211(\354\202\254\353\260\251\355\203\220\354\203\211)\354\225\204\354\235\264\353\224\224\354\226\264.py" create mode 100644 "1699\354\240\234\352\263\261\354\210\230\354\235\230\355\225\251.py" create mode 100644 "1707\354\235\264\353\266\204_\352\267\270\353\236\230\355\224\204.py" create mode 100644 "17087\354\210\250\353\260\224\352\274\255\354\247\2106.py" create mode 100644 "17103\352\263\250\353\223\234\353\260\224\355\235\220\355\214\214\355\213\260\354\205\230_\354\213\234\352\260\204\354\264\210\352\263\274.py" create mode 100644 "17103\352\263\250\353\223\234\353\260\224\355\235\220\355\214\214\355\213\260\354\205\230_\354\260\270\352\263\240\354\275\224\353\223\234.py" create mode 100644 "17123\353\260\260\354\227\264\353\206\200\354\235\264.py" create mode 100644 "17123\353\260\260\354\227\264\353\206\200\354\235\264_2\354\260\250\354\213\234.py" create mode 100644 "1717\354\247\221\355\225\251\354\235\230\355\221\234\355\230\204.py" create mode 100644 17298.py create mode 100644 17299.py create mode 100644 "17404RGB\352\261\260\353\246\2542.py" create mode 100644 17413.py create mode 100644 "1748\354\210\230\354\235\264\354\226\264\354\223\260\352\270\260.py" create mode 100644 "1918_\355\233\204\354\234\204\355\221\234\352\270\260.py" create mode 100644 "1929\354\206\214\354\210\230\354\260\276\352\270\260.py" create mode 100644 "1934 \354\234\240\355\201\264\353\246\254\353\223\234\355\230\270\354\240\234\353\262\225.py" create mode 100644 "1935_\355\233\204\354\234\204\355\221\234\352\270\260\354\213\235.py" create mode 100644 "1978\354\206\214\354\210\230\354\260\276\352\270\260.py" create mode 100644 "2004\354\241\260\355\225\251.py" create mode 100644 "2089_-2\354\247\204\354\210\230.py" create mode 100644 "2133\355\203\200\354\235\274\354\261\204\354\232\260\352\270\260.py" create mode 100644 "2178\353\257\270\353\241\234\355\203\220\354\203\211.py" create mode 100644 "2225\355\225\251\353\266\204\355\225\264.py" create mode 100644 "2225\355\225\251\353\266\204\355\225\264re.py" create mode 100644 "2309\354\235\274\352\263\261\353\202\234\354\236\245\354\235\264.py" create mode 100644 "2447\353\263\204\354\260\215\352\270\26010.py" create mode 100644 "2529\353\266\200\353\223\261\355\230\270.py" create mode 100644 "2609\354\265\234\352\263\265\354\225\275\352\263\265\353\260\260.py" create mode 100644 "2667\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.py" create mode 100644 "2743\353\213\250\354\226\264\352\270\270\354\235\264\354\236\254\352\270\260.py" create mode 100644 "2745\354\247\204\353\262\225\353\263\200\355\231\230_\353\202\230\354\244\221\354\227\220 \353\230\220\352\263\265\353\266\200.py" create mode 100644 "3085\354\202\254\355\203\225\352\262\214\354\236\204.py" create mode 100644 "3587\354\204\261\353\203\245\352\260\234\353\271\204.py" create mode 100644 369game.py create mode 100644 4446ROT12.py create mode 100644 "4963\354\204\254\354\235\230\352\260\234\354\210\230_bfs.py" create mode 100644 "4963\354\204\254\354\235\230\352\260\234\354\210\230_dfs.py" create mode 100644 "6588\352\263\250\353\223\234\353\260\224\355\235\220.py" create mode 100644 "6603\353\241\234\353\230\220.py" create mode 100644 "6603\353\241\234\353\230\220_DFS.py" create mode 100644 "7562\353\202\230\354\235\264\355\212\270\354\235\230\354\235\264\353\217\231.py" create mode 100644 "7576\355\206\240\353\247\210\355\206\240.py" create mode 100644 "9242\355\217\255\355\203\204\355\225\264\354\262\264.py" create mode 100644 "9465\354\212\244\355\213\260\354\273\244.py" create mode 100644 9613GCD.py create mode 100644 "9613\343\205\216\343\205\212\343\205\207.py" create mode 100644 ATM_beakjooon11399.py create mode 100644 CREATE TABLE MP_BOARD.http.txt create mode 100644 CREATE TABLE MP_BOARD.js create mode 100644 KCM_algorythm.py create mode 100644 "LC169_\352\263\274\353\260\230\354\210\230.py" create mode 100644 "LC241\354\210\253\354\236\220\354\227\260\354\202\260\354\236\220\354\241\260\355\225\251.py" create mode 100644 README.md.txt create mode 100644 __pycache__/lotto_numbering_module.cpython-38.pyc create mode 100644 backtracking_DFS.py create mode 100644 beakjoon1006_dp.py create mode 100644 beakjoon1463.py create mode 100644 beakjoon1463_dp.py create mode 100644 beakjoon2839.py create mode 100644 beakjoon9095_dp.py create mode 100644 bfs.py create mode 100644 bitsolved.py create mode 100644 calkin_wilf_tree1.py create mode 100644 color_fulling.py create mode 100644 color_mine.py create mode 100644 common_list_number.py create mode 100644 double_linkedList.py create mode 100644 find_str_replace_practice.py create mode 100644 hashtable2..py create mode 100644 infinity_dic.py create mode 100644 infinity_dic_pass.py create mode 100644 length_make_mountain.py create mode 100644 list_practice.py create mode 100644 list_subset_practice_later.py create mode 100644 local_global_practice.py create mode 100644 lotto_numbering_module.py create mode 100644 make_purple section_practice.py create mode 100644 map,filter,lambda,eval_practice.py create mode 100644 mapping.py create mode 100644 max_min practce.py create mode 100644 meetingroom_beakjooon1931.py create mode 100644 nQueen.py create mode 100644 object_oriented_practice.py create mode 100644 paskal_triangle.py create mode 100644 patternMatching.py create mode 100644 quickSoreted.py create mode 100644 score set_practice.py create mode 100644 score_aver,total_practice.py create mode 100644 snail_number.py create mode 100644 sugar_delievery2839.py create mode 100644 "tree\354\240\225\353\246\254.py" create mode 100644 using_lotto.py create mode 100644 "\352\270\260\353\212\245\352\260\234\353\260\234.py" create mode 100644 "\353\263\200\354\210\230\353\252\205.PNG" create mode 100644 "\354\230\210\354\240\234\353\252\250\354\235\214.py" create mode 100644 "\354\240\221\353\257\270\354\202\254\353\260\260\354\227\264.py" create mode 100644 "\355\224\204\353\241\234\352\267\270\353\236\230\353\250\270\354\212\244_\354\230\244\355\224\210\354\261\204\355\214\205\353\260\251.py" diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..dbd9e23 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Current File", + "type": "python", + "request": "launch", + "program": "${file}", + "console": "integratedTerminal" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c6733b6 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "C:\\anaconda3\\python.exe" +} \ No newline at end of file diff --git a/1002.py b/1002.py new file mode 100644 index 0000000..664dce8 --- /dev/null +++ b/1002.py @@ -0,0 +1,18 @@ +t = int(input()) +for i in range(t): + x1, y1, r1, x2, y2, r2 = map(int, input().split()) + d = ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5 + rs = r1 + r2 + rm = abs(r1 - r2) + if d == 0: + if r1 == r2: + print(-1) + else: + print(0) + else: + if d == rs or d == rm: + print(1) + elif d < rs and d > rm: + print(2) + else: + print(0) \ No newline at end of file diff --git a/1010.py b/1010.py new file mode 100644 index 0000000..5493057 --- /dev/null +++ b/1010.py @@ -0,0 +1,14 @@ + +T = int(input()) + +for test in range(T): + N,M = map(int,input().split()) + a,b = 1,1 + for i in range(N): + a = a*(M-i) + for i in range(1,N+1): + b = b*i + + ans = int(a/b) + + print(ans) \ No newline at end of file diff --git "a/10430\354\227\260\354\202\260.py" "b/10430\354\227\260\354\202\260.py" new file mode 100644 index 0000000..fae95e2 --- /dev/null +++ "b/10430\354\227\260\354\202\260.py" @@ -0,0 +1,12 @@ +A, B= map(int,input().split()) +C, D=A,B + +while A%B != 0: + if A>B: + A = A%B + if B>A: + B = B%A + +print(A) + +print((C/A)*D) \ No newline at end of file diff --git "a/10775\352\263\265\355\225\255.py" "b/10775\352\263\265\355\225\255.py" new file mode 100644 index 0000000..aedc3c3 --- /dev/null +++ "b/10775\352\263\265\355\225\255.py" @@ -0,0 +1,30 @@ +import sys +input = sys.stdin.readline + +G = int(input()) +P = int(input()) +parent = [i for i in range(G+1)] + +def find(v): + if parent[v] == v: + return v + parent[v] = find(parent[v]) + return parent[v] + +def union(a, b): + a = find(a) + b = find(b) + parent[b] = a + +arr = [int(input()) for _ in range(P)] + +ans = 0 + +for v in arr: + p = find(v) + if p == 0: + break + ans += 1 + union(p-1, p) + +print(ans) \ No newline at end of file diff --git "a/10808\354\225\214\355\214\214\353\261\203\352\260\234\354\210\230.py" "b/10808\354\225\214\355\214\214\353\261\203\352\260\234\354\210\230.py" new file mode 100644 index 0000000..076cf33 --- /dev/null +++ "b/10808\354\225\214\355\214\214\353\261\203\352\260\234\354\210\230.py" @@ -0,0 +1,10 @@ + +S = input() +alpha = [-1]*26 + +for i in range(len(S)): + if(alpha[ord(S[i])-ord('a')] == -1): + alpha[ord(S[i])-ord('a')] = i + +for i in alpha: + print(i,end=" ") \ No newline at end of file diff --git "a/10809\354\225\214\355\214\214\353\261\203\354\260\276\352\270\260.py" "b/10809\354\225\214\355\214\214\353\261\203\354\260\276\352\270\260.py" new file mode 100644 index 0000000..076cf33 --- /dev/null +++ "b/10809\354\225\214\355\214\214\353\261\203\354\260\276\352\270\260.py" @@ -0,0 +1,10 @@ + +S = input() +alpha = [-1]*26 + +for i in range(len(S)): + if(alpha[ord(S[i])-ord('a')] == -1): + alpha[ord(S[i])-ord('a')] = i + +for i in alpha: + print(i,end=" ") \ No newline at end of file diff --git "a/10819\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254\354\227\206\354\235\264.py" "b/10819\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254\354\227\206\354\235\264.py" new file mode 100644 index 0000000..07245f5 --- /dev/null +++ "b/10819\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254\354\227\206\354\235\264.py" @@ -0,0 +1,57 @@ +import sys + + +def next_permutation(list_a): + k = -1 + m = -1 + + # 증가하는 마지막 부분을 가리키는 index k 찾기 + for i in range(len(list_a)-1): + if list_a[i] < list_a[i+1]: + k = i + + # 전체 내림차순일 경우, 반환 + if k == -1: + return [-1] + + # index k 이후 부분 중 값이 k보다 크면서 가장 멀리 있는 index m 찾기 + for i in range(k, len(list_a)): + if list_a[k] < list_a[i]: + m = i + + # k와 m의 값 바꾸기 + list_a[k], list_a[m] = list_a[m], list_a[k] + + # k index 이후 오름차순 정렬 + list_a = list_a[:k+1] + sorted(list_a[k+1:]) + return list_a + + +# 주어진 값 입력 & 정렬 +n = int(sys.stdin.readline()) +a = list(map(int, sys.stdin.readline().split())) +a.sort() + +ans = 0 +# 첫 순열 내 값 차이를 더해(s), ans 보다 크면 ans를 update +s = 0 +for j in range(len(a) - 1): + s += abs(a[j] - a[j+1]) +if s > ans: + ans = s + +arr = a + +while True: + arr = next_permutation(arr) + if arr == [-1]: + break + s = 0 + + # 순열마다 차이를 더해(s), ans 보다 크면 ans를 update + for j in range(len(arr) - 1): + s += abs(arr[j] - arr[j+1]) + if s > ans: + ans = s + +print(ans) \ No newline at end of file diff --git "a/10819\354\260\250\354\235\264\353\245\274\354\265\234\353\214\200\353\241\234.py" "b/10819\354\260\250\354\235\264\353\245\274\354\265\234\353\214\200\353\241\234.py" new file mode 100644 index 0000000..ea917d0 --- /dev/null +++ "b/10819\354\260\250\354\235\264\353\245\274\354\265\234\353\214\200\353\241\234.py" @@ -0,0 +1,15 @@ +import sys +input = sys.stdin.readline +from itertools import permutations + +N = int(input()) +A = list(map(int,input().split())) +p = permutations(A) +ans = [] +for nums in p: + sum_nums = 0 + for i in range(0,len(nums)-1): + sum_nums += abs(nums[i]-nums[i+1]) + ans.append(sum_nums) + +print(max(ans)) \ No newline at end of file diff --git a/10820.py b/10820.py new file mode 100644 index 0000000..2782e78 --- /dev/null +++ b/10820.py @@ -0,0 +1,19 @@ +import sys + +while True: + line = sys.stdin.readline().rstrip('\n') + up, lo, sp, nu = 0, 0, 0, 0 + if not line: + break + for l in line: + if l.isupper(): + up += 1 + elif l.islower(): + lo += 1 + elif l.isdigit(): + nu += 1 + elif l.isspace(): + sp += 1 + + sys.stdout.write("{} {} {} {}\n".format(lo, up, nu, sp)) + diff --git "a/10824\353\204\244\354\210\230.py" "b/10824\353\204\244\354\210\230.py" new file mode 100644 index 0000000..dbc6285 --- /dev/null +++ "b/10824\353\204\244\354\210\230.py" @@ -0,0 +1,3 @@ +S = ["a","b","c"] +B = ["a"] +print(S-B) \ No newline at end of file diff --git "a/10872\355\214\251\355\206\240\353\246\254\354\226\274.py" "b/10872\355\214\251\355\206\240\353\246\254\354\226\274.py" new file mode 100644 index 0000000..1f08090 --- /dev/null +++ "b/10872\355\214\251\355\206\240\353\246\254\354\226\274.py" @@ -0,0 +1,8 @@ +N = int(input()) + +ans=1 +if N>1: + for i in range(2,N+1): + ans *= i + +print(ans) \ No newline at end of file diff --git a/10972.py b/10972.py new file mode 100644 index 0000000..c33f3cf --- /dev/null +++ b/10972.py @@ -0,0 +1,21 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +s = list(map(int,input().split())) +flag = 0 +for i in range(1,N): + if s[-i] > s[-i-1]: + for j in range(1,i): + if s[-i-1] < s[-j]: + s[-i-1],s[-j] = s[-j],s[-i-1] + s = s[:-i-1] + sorted(s[-i-1:]) + flag = 1 + break + if flag: + print(*s) + break + +if not flag: + print(-1) + diff --git "a/10973\354\235\264\354\240\204\354\210\234\354\227\264.py" "b/10973\354\235\264\354\240\204\354\210\234\354\227\264.py" new file mode 100644 index 0000000..38e56ba --- /dev/null +++ "b/10973\354\235\264\354\240\204\354\210\234\354\227\264.py" @@ -0,0 +1,20 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +pers = list(map(int,input().split())) +ans = [] + +for i in range(N-1,0,-1): + if pers[i] < pers[i-1]: + for j in range(N-1,i-1,-1): + if pers[i-1] >pers[j]: + pers[i-1],pers[j] = pers[j],pers[i-1] + ans = pers[:i] + sorted(pers[i:],reverse=True) + print(*ans) + break + if ans: + break + +if not ans: + print(-1) diff --git "a/10974\353\252\250\353\223\240\354\210\234\354\227\264.py" "b/10974\353\252\250\353\223\240\354\210\234\354\227\264.py" new file mode 100644 index 0000000..c21434c --- /dev/null +++ "b/10974\353\252\250\353\223\240\354\210\234\354\227\264.py" @@ -0,0 +1,7 @@ +from itertools import permutations + +N = int(input()) + +permutation_s = permutations(range(1,N+1)) +for x in permutation_s: + print(*x) \ No newline at end of file diff --git "a/10974\353\252\250\353\223\240\354\210\234\354\227\264_dfs.py" "b/10974\353\252\250\353\223\240\354\210\234\354\227\264_dfs.py" new file mode 100644 index 0000000..8532fd3 --- /dev/null +++ "b/10974\353\252\250\353\223\240\354\210\234\354\227\264_dfs.py" @@ -0,0 +1,21 @@ +from sys import stdin + + +def dfs(depth): + if depth == n: + answer.append([num for num in permutation_deep]) + else: + for i in range(n): + if i + 1 in permutation_deep: + continue + permutation_deep[depth] = i + 1 + dfs(depth + 1) + permutation_deep[depth] = 0 + +answer = [] +n = int(stdin.readline()) +permutation_deep = [0] * n +dfs(0) + +for case in answer: + print(*case) \ No newline at end of file diff --git "a/10988\355\214\260\353\246\260\353\223\234\353\241\254\354\235\270\354\247\200 \355\231\225\354\235\270\355\225\230\352\270\260.py" "b/10988\355\214\260\353\246\260\353\223\234\353\241\254\354\235\270\354\247\200 \355\231\225\354\235\270\355\225\230\352\270\260.py" new file mode 100644 index 0000000..77b99af --- /dev/null +++ "b/10988\355\214\260\353\246\260\353\223\234\353\241\254\354\235\270\354\247\200 \355\231\225\354\235\270\355\225\230\352\270\260.py" @@ -0,0 +1,13 @@ +import sys +input = sys.stdin.readline + +S = tuple(input().rstrip()) + +S_copy = S +S_copy = list(S_copy) +reverse_S = [] +for _ in range(len(S)): + reverse_S.append(S_copy.pop()) +S = list(S) + +print(1 if S==reverse_S else 0) \ No newline at end of file diff --git "a/11000\352\260\225\354\235\230\354\213\244\353\260\260\354\240\225.py" "b/11000\352\260\225\354\235\230\354\213\244\353\260\260\354\240\225.py" new file mode 100644 index 0000000..376b47b --- /dev/null +++ "b/11000\352\260\225\354\235\230\354\213\244\353\260\260\354\240\225.py" @@ -0,0 +1,19 @@ +import heapq +import sys + +N = int(input()) + +timeTable = [list(map(int,sys.stdin.readline().split())) for _ in range(N)] +timeTable.sort(key=lambda x: x[0]) + +queue = [] +heapq.heappush(queue,timeTable[0][1]) + +for i in range(1,N): + if queue[0] > timeTable[i][0]: + heapq.heappush(queue,timeTable[i][1]) + else: + heapq.heappop(queue) + heapq.heappush(queue,timeTable[i][1]) + +print(len(queue)) diff --git "a/11000\352\260\225\354\235\230\354\213\244\353\260\260\354\240\225_1\354\260\250.py" "b/11000\352\260\225\354\235\230\354\213\244\353\260\260\354\240\225_1\354\260\250.py" new file mode 100644 index 0000000..80415f5 --- /dev/null +++ "b/11000\352\260\225\354\235\230\354\213\244\353\260\260\354\240\225_1\354\260\250.py" @@ -0,0 +1,22 @@ +N = int(input()) +Si = [] +Ti = [] +check = [False] * N + +for _ in range(N): + i,j = map(int,input().split()) + Si.append(i) + Ti.append(j) + + +cnt = 0 + +while sum(check) != N: + finish = 0 + for i in range(N): + if Si[i] >= finish and check[i] == False: + finish = Ti[i] + check[i] = True + cnt+=1 + +print(cnt) \ No newline at end of file diff --git "a/11005\354\247\204\353\262\225\353\263\200\355\231\230_\353\202\230\354\244\221\354\227\220 \353\230\220\352\263\265\353\266\200.py" "b/11005\354\247\204\353\262\225\353\263\200\355\231\230_\353\202\230\354\244\221\354\227\220 \353\230\220\352\263\265\353\266\200.py" new file mode 100644 index 0000000..50cf004 --- /dev/null +++ "b/11005\354\247\204\353\262\225\353\263\200\355\231\230_\353\202\230\354\244\221\354\227\220 \353\230\220\352\263\265\353\266\200.py" @@ -0,0 +1,11 @@ +system = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" #10진법이면 9 까지, 36진법이면 Z까지 표현된다 +N, B = map(int, input().split()) +answer = '' + +while N != 0: + # N을 B로 나눈 나머지를 마지막칸에 채움(1의자리)(36진법이면 나머지 = 36진법중 2번째 숫자) + answer += str(system[N % B]) #위치로 진법 변환 + # N을 B로 나눈 몫이 N이 된다. + N //= B + +print(answer[::-1]) \ No newline at end of file diff --git "a/1102\353\260\234\354\240\204\354\206\214_\355\221\270\353\212\224\354\244\221.py" "b/1102\353\260\234\354\240\204\354\206\214_\355\221\270\353\212\224\354\244\221.py" new file mode 100644 index 0000000..e19b320 --- /dev/null +++ "b/1102\353\260\234\354\240\204\354\206\214_\355\221\270\353\212\224\354\244\221.py" @@ -0,0 +1,43 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +cost = [list(map(int,input().split())) for _ in range(N)] +electric = list(input()) +P = int(input()) - electric.count("Y") +dp=[[0,0]] * N +cnt = 0 + +if electric.count("Y") == 0: + print(-1) +elif electric.count("Y") > P: + print(0) + +while P != cnt: + for i in range(N): + if electric[i] == "Y": + for j in range(N): + if i != j and dp[j][0] == cnt : + dp[j] = [cnt+1, dp[j][1] + cost[i][j]] + print(dp) + + + # 일단 Y인것들 dp에 다 초기화. + # 0이 아닌 것들 중에서 똑같이 진행. + # cnt이용 P만큼 켜졌을때 종료. 가장 작은 dp로 채택. + + for i in range(N): + if dp[i][1] != 0: + electric[i] = "Y" + + cnt+=1 + +ans_list = [] +for i in range(N): + if dp[i][0] == P: + ans_list.append(dp[i][1]) + +if not ans_list: + print(-1) +else: + print(min(ans_list)) diff --git a/11052.py b/11052.py new file mode 100644 index 0000000..d55ce16 --- /dev/null +++ b/11052.py @@ -0,0 +1,12 @@ +N = int(input()) +P = [0] + list(map(int,input().split())) +dp = [0]*(N+1) + +dp[1] = P[1] + +# dp[i]랑 dp k 전에꺼 + k개 들어있는 팩의 값 +for i in range(2,N+1): + for k in range(1,i+1): + dp[i] = max(dp[i],dp[i-k]+P[k]) + +print(dp[N]) \ No newline at end of file diff --git "a/11054\353\260\224\354\235\264\355\206\240\353\213\211\353\266\200\353\266\204\354\210\230\354\227\264.py" "b/11054\353\260\224\354\235\264\355\206\240\353\213\211\353\266\200\353\266\204\354\210\230\354\227\264.py" new file mode 100644 index 0000000..efeaf9e --- /dev/null +++ "b/11054\353\260\224\354\235\264\355\206\240\353\213\211\353\266\200\353\266\204\354\210\230\354\227\264.py" @@ -0,0 +1,19 @@ +N = int(input()) +A = [0] + list(map(int, input().split())) +LDS = [1]*(N+1) +LIS = [1]*(N+1) +Bi = [] + + + +for i in range(1,N+1): + for j in range(1,i): + if A[i]>A[j] and LIS[i]<=LIS[j]: + LIS[i] = LIS[j] + 1 + if A[-i]>A[-j] and LDS[-i]<=LDS[-j]: + LDS[-i] = LDS[-j] + 1 + +for i in range(1,N+1): + Bi.append(LIS[i]+LDS[i]-1) + +print(max(Bi)) diff --git a/11055LIS.py b/11055LIS.py new file mode 100644 index 0000000..0fc28bd --- /dev/null +++ b/11055LIS.py @@ -0,0 +1,13 @@ +N = int(input()) +A = [0] + list(map(int, input().split())) +dp = [0]*(N+1) + + +for i in range(1,N+1): + s = [0] + for j in range(1,i): + if A[i]>A[j]: + s.append(dp[j]) + dp[i] = max(s)+A[i] + +print(max(dp)) diff --git "a/11057\354\230\244\353\245\264\353\247\211\354\210\230.py" "b/11057\354\230\244\353\245\264\353\247\211\354\210\230.py" new file mode 100644 index 0000000..848ac44 --- /dev/null +++ "b/11057\354\230\244\353\245\264\353\247\211\354\210\230.py" @@ -0,0 +1,15 @@ +n = int(input()) + +matrix=[[1]*10 for _ in range(n)] + +for i in range(1,n): + sum=0 + for j in range(10): + for k in range(j+1): + matrix[i][j] += matrix[i-1][k] + sum += matrix[i-1][k] + +if n==1: + print(10) +else: + print(sum%10007) \ No newline at end of file diff --git "a/11060\354\240\220\355\224\204\354\240\220\355\224\204.py" "b/11060\354\240\220\355\224\204\354\240\220\355\224\204.py" new file mode 100644 index 0000000..a0f5721 --- /dev/null +++ "b/11060\354\240\220\355\224\204\354\240\220\355\224\204.py" @@ -0,0 +1,24 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +A = list(map(int,input().split())) +check = [False] * 1200 +ans = [] +v = 0 +cnt = 0 +def DFS(v,cnt): + if v>=N-1: + ans.append(cnt) + return + if A[v]==0: + return + for i in range(1,A[v]+1): + if not check[v+i] and not v+i>N-1: + check[v+i] = True + DFS(v+i,cnt+1) + check[v+i] = False + +check[0]=True +DFS(0,0) +print(min(ans) if ans else -1) \ No newline at end of file diff --git "a/11060\354\240\220\355\224\204\354\240\220\355\224\204_bfs.py" "b/11060\354\240\220\355\224\204\354\240\220\355\224\204_bfs.py" new file mode 100644 index 0000000..d4ea35d --- /dev/null +++ "b/11060\354\240\220\355\224\204\354\240\220\355\224\204_bfs.py" @@ -0,0 +1,19 @@ +n = int(input()) +lst = list(map(int, input().split())) + +dp = [-1] * n + +def bfs(start): + q = [] + q.append(start) + dp[start] = 0 + while q: + v = q.pop(0) + jump = lst[v] + for i in range(jump, 0, -1): + if v + i < n and dp[v + i] == -1: + dp[v + i] = dp[v] + 1 + q.append(v + i) + +bfs(0) +print(dp[-1]) \ No newline at end of file diff --git "a/11060\354\240\220\355\224\204\354\240\220\355\224\204_dp.py" "b/11060\354\240\220\355\224\204\354\240\220\355\224\204_dp.py" new file mode 100644 index 0000000..19a90b2 --- /dev/null +++ "b/11060\354\240\220\355\224\204\354\240\220\355\224\204_dp.py" @@ -0,0 +1,10 @@ +N = int(input()) +li = list(map(int, input().split())) +dp = [N+1]*N +dp[0] = 0 +for i in range(N): + for j in range(1, li[i]+1): + if i+j >= N: + break + dp[i+j] = min(dp[i+j], dp[i]+1) +print(dp[N-1] if dp[N-1] != N+1 else -1) \ No newline at end of file diff --git "a/1113\354\210\230\354\230\201\354\236\245\353\247\214\353\223\244\352\270\260.py" "b/1113\354\210\230\354\230\201\354\236\245\353\247\214\353\223\244\352\270\260.py" new file mode 100644 index 0000000..e8490a9 --- /dev/null +++ "b/1113\354\210\230\354\230\201\354\236\245\353\247\214\353\223\244\352\270\260.py" @@ -0,0 +1,6 @@ + + +N,M = map(int,input().split()) +matrix = [list(map(int,list(map(str,input().split())))) for _ in range(N)] + +# 일단 \ No newline at end of file diff --git a/11437LCA.py b/11437LCA.py new file mode 100644 index 0000000..2047cb6 --- /dev/null +++ b/11437LCA.py @@ -0,0 +1,57 @@ +import sys +input = sys.stdin.readline +sys.setrecursionlimit(100000) + + +def dfs(v, d): + depth[v] = d + visited[v] = True + + for child in tree[v]: + if not visited[child]: + parent[child][0] = v + dfs(child, d+1) + +def find_parent(): + for i in range(1, 21): + for j in range(1, V+1): + parent[j][i] = parent[parent[j][i-1]][i-1] + +def lca(a, b): + if depth[a] > depth[b]: + a, b = b, a + for i in range(20, -1, -1): + if depth[b] - depth[a] >= (1<1: + for i in range(2,N+1): + if N%i==0: + print(i) + N = int(N/i) + break diff --git "a/11656\354\240\221\353\257\270\354\202\254\353\260\260\354\227\264.py" "b/11656\354\240\221\353\257\270\354\202\254\353\260\260\354\227\264.py" new file mode 100644 index 0000000..ad157fd --- /dev/null +++ "b/11656\354\240\221\353\257\270\354\202\254\353\260\260\354\227\264.py" @@ -0,0 +1,9 @@ +S = str(input()) +S_list = [] + +for _ in S: + S_list.append(S) + S = S[1:] + +for i in sorted(S_list): + print(i) \ No newline at end of file diff --git "a/1165RCT\354\225\224\355\230\270\355\231\224.py" "b/1165RCT\354\225\224\355\230\270\355\231\224.py" new file mode 100644 index 0000000..1b33f87 --- /dev/null +++ "b/1165RCT\354\225\224\355\230\270\355\231\224.py" @@ -0,0 +1,6 @@ +num = list(input().split()) + +A = int(num[0] + num[1]) +B = int(num[2] + num[3]) + +print(A+B) diff --git a/11722LDS.py b/11722LDS.py new file mode 100644 index 0000000..891d8f5 --- /dev/null +++ b/11722LDS.py @@ -0,0 +1,12 @@ +N = int(input()) +A = [0] + list(map(int, input().split())) +dp = [1]*(N+1) + + +for i in range(1,N+1): + for j in range(1,i): + if A[i] 앞에서 -가 생략이 됐고 그게 최적이라면 dp[i-1][1]+lst[i]가 더 커야하고 아니라면 + # 앞의 생략이 최적이 아니므로 dp[i-1][0]의 생략 안된 값을 가져와 나를 생략하고 저장하게 됨. + # 즉 생략 안된 list로 부터 나를 제외 한 값과 아닌 값을 유지해 나가며 비교하면 최적값을 구할 수 있음. + dp[i][1] = max(dp[i - 1][0], dp[i - 1][1] + lst[i]) + +ans = -999999999 +for i in range(n): + ans = max(ans, dp[i][0], dp[i][1]) +print(ans) diff --git "a/1342\355\226\211\354\232\264\354\235\230\353\254\270\354\236\220\354\227\264.py" "b/1342\355\226\211\354\232\264\354\235\230\353\254\270\354\236\220\354\227\264.py" new file mode 100644 index 0000000..749758e --- /dev/null +++ "b/1342\355\226\211\354\232\264\354\235\230\353\254\270\354\236\220\354\227\264.py" @@ -0,0 +1,41 @@ +from sys import stdin +input = stdin.readline + +def dfs(depth, string): + global N, ret, charSet, cntMap + + if depth == N: + # print(string) + ret += 1 + return + + for char in charSet: + idx = ord(char) - ord('a') + # 알파뱃 카운트가 0이면 그 알파뱃으로 돌지 않는다. + if cntMap[idx] == 0: + continue + # 중요한게 string''면 -1인덱스 오류날텐데 string존재여부를 앞에 두어 없으면 앞에서 False나서 돌아가게 설계.! 기억할것. + # 문자열이 존재하고 문자열 -1값이 알파뱃이랑 같으면 돌지 않는다. + if string and string[-1] == char: + continue + # 문자열이 비었거나 알파뱃카운트가 있고 전이랑 지금알파뱃이 다를때. + # 알파뱃 카운트 컨트롤, depth늘려주며 길이 체크, string에 문자추가. + cntMap[idx] -= 1 + dfs(depth + 1, string + char) + cntMap[idx] += 1 + + +raw = input().strip() +cntMap = [0] * 26 +N = len(raw) +ret = 0 +charSet = set() + +for char in raw: + idx = ord(char) - ord('a') + cntMap[idx] = cntMap[idx] + 1 + charSet.add(char) +# print(charSet, cntMap, cntSum) + +dfs(0, '') +print(ret) \ No newline at end of file diff --git "a/13549\354\210\250\353\260\224\352\274\255\354\247\2103.py" "b/13549\354\210\250\353\260\224\352\274\255\354\247\2103.py" new file mode 100644 index 0000000..795d634 --- /dev/null +++ "b/13549\354\210\250\353\260\224\352\274\255\354\247\2103.py" @@ -0,0 +1,29 @@ +import sys +input = sys.stdin.readline +from collections import deque + +N,K = map(int,input().split()) +queue=deque() +time = [-1]*100001 + +def BFS(N,K): + queue.append(N) + time[N] = 0 + while queue: + N = queue.popleft() + if N==K: + print(time[K]) + exit() + for next_node in (2*N,N+1,N-1): + if 0<=next_node<100001 and time[next_node]==-1: + if next_node == 2*N: + # 위상이 같을때는 queue앞에 넣어주어도 됨.(위상 = level,time,count) + queue.appendleft(next_node) + time[next_node] = time[N] + else: + queue.append(next_node) + time[next_node] = time[N]+1 +if Narr[j]: + dp[i] = max(dp[i], dp[j]+1) + +print(max(dp)) + +order = max(dp) +lst = [] +for i in range(N-1, -1, -1): + if dp[i]==order: + lst.append(arr[i]) + order-=1 +# lst.reverse() +while lst: + print(lst.pop(), end=' ') diff --git "a/14226\354\235\264\353\252\250\355\213\260\354\275\230_\353\202\264\352\272\274.py" "b/14226\354\235\264\353\252\250\355\213\260\354\275\230_\353\202\264\352\272\274.py" new file mode 100644 index 0000000..e369b7b --- /dev/null +++ "b/14226\354\235\264\353\252\250\355\213\260\354\275\230_\353\202\264\352\272\274.py" @@ -0,0 +1,38 @@ +import sys +input = sys.stdin.readline +from collections import deque + + + + +S = int(input()) +screen = 1 +board = 1 +queue = deque() +time = [0]*1001 +# 영선이는 효빈이에게 이모티콘 S개를 보낸다. + +# 각 연산은 1초씩 소모. +# 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다. +# 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다. +# 화면에 있는 이모티콘 중 하나를 삭제한다. + +# 최초 1개 -> s개를 만드는데 연산은 저장 붙혀넣기 2초에 2배. or 1초에 클립보드 만큼 가져올 수 있음. 1초에 -1 +# +# +# 핵심 아이디어는 time을 2차원배열 time[screen][board]형태로 만들어야 겹치는 값이 안들어감. +# 변하는 변수가 2개여서 쌍으로 움직여야하고 1차원 dp가 값이 중복해서 들어간다? => 2차원 dp로 변경. +queue.append([screen,board]) +while queue: + screen,board = queue.popleft() + if screen == S: + print(time[S]) + break + for next in (screen-1,screen,screen+board): + if 0<=next < 1001 and not time[next]: + if next == screen: + board = screen + queue.append([next,board]) + time[next] = time[screen] + 1 + + diff --git "a/14226\354\235\264\353\252\250\355\213\260\354\275\230_\353\213\265.py" "b/14226\354\235\264\353\252\250\355\213\260\354\275\230_\353\213\265.py" new file mode 100644 index 0000000..3fed4d9 --- /dev/null +++ "b/14226\354\235\264\353\252\250\355\213\260\354\275\230_\353\213\265.py" @@ -0,0 +1,25 @@ +from collections import deque +n = int(input()) +dist = [[-1]* (n+1) for _ in range(n+1)] +q = deque() + + +q.append((1,0)) # 화면 이모티콘 개수, 클립보드 이모티콘 개수 +dist[1][0] = 0 +while q: + s,c = q.popleft() + if dist[s][s] == -1: # 방문하지 않았으면 + dist[s][s] = dist[s][c] + 1 + q.append((s,s)) + if s+c <= n and dist[s+c][c] == -1: + dist[s+c][c] = dist[s][c] + 1 + q.append((s+c, c)) + if s-1 >= 0 and dist[s-1][c] == -1: + dist[s-1][c] = dist[s][c] + 1 + q.append((s-1, c)) +answer = -1 +for i in range(n+1): + if dist[n][i] != -1: + if answer == -1 or answer > dist[n][i]: + answer = dist[n][i] +print(answer) \ No newline at end of file diff --git "a/14391\354\242\205\354\235\264\354\241\260\352\260\201.py" "b/14391\354\242\205\354\235\264\354\241\260\352\260\201.py" new file mode 100644 index 0000000..6f77ba6 --- /dev/null +++ "b/14391\354\242\205\354\235\264\354\241\260\352\260\201.py" @@ -0,0 +1,47 @@ +import itertools + +# input +n, m = map(int, input().split()) +x_lst = [] +for _ in range(n): + x_lst.append(list(map(int, (input())))) + +# matrix 1d -> 2d convert +def to_matrix(l,m) : + return [l[i:i+m] for i in range(0, len(l), m)] + +# itertools의 product를 이용해서 비트마스크 제너레이터 만들기 +# e.g) (0,0,0,0), (0,0,0,1) ... (1,1,1,1) +a = itertools.product([0, 1], repeat=n*m) +ans = 0 + +# 가로부터 합계를 구해주고 세로 합계 구해줘서 더함 +for x in a: + bit_mask = to_matrix(x, m) + sumh = 0 + + for i in range(n): + hori = 0 + for j in range(m): + if bit_mask[i][j] == 0: + hori = 10 * hori + x_lst[i][j] + if bit_mask[i][j] == 1 or j == m - 1: + sumh = sumh + hori + hori = 0 + + sumv = 0 + + for j in range(m): + vert = 0 + for i in range(n): + if bit_mask[i][j] == 1: + vert = 10 * vert + x_lst[i][j] + if bit_mask[i][j] == 0 or i == n - 1: + sumv = sumv + vert + vert = 0 + + sum_all = sumh + sumv + + ans = max(ans, sum_all) + +print(ans) \ No newline at end of file diff --git "a/14500\355\205\214\355\212\270\353\241\234\353\257\270\353\205\270.py" "b/14500\355\205\214\355\212\270\353\241\234\353\257\270\353\205\270.py" new file mode 100644 index 0000000..71eb8dc --- /dev/null +++ "b/14500\355\205\214\355\212\270\353\241\234\353\257\270\353\205\270.py" @@ -0,0 +1,57 @@ +import sys +input = sys.stdin.readline + +# 사방 +dx = [1, -1, 0, 0] +dy = [0, 0, -1, 1] + +# 빠큐모양 고려해야될 4개. +mfinger = [[[0, 1], [0, 2], [-1, 1]], [[0, 1], [0, 2], [1, 1]], +[[1, 0], [2, 0], [1, 1]], [[1, 0], [1, -1], [2, 0]]] + + +n, m = map(int, input().split()) +s = [] +# check박스 +visit = [[0] * m for _ in range(n)] + +# DFS 들어가고 나오고 max값만 비교. +# 먼가 이거 상하향은 고려안해도 될것 같은 느낌인데.. +# (2방향으로 DFS 하고 L자 삐져나오는 모양이랑 미음자 따로 계산해주는 게 날듯. 3가지 케이스니까.) +def dfs(x, y, cnt, num): + global result + if cnt == 4: + result = max(result, num) + return + for i in range(4): + nx = x + dx[i] + ny = y + dy[i] + if 0 <= nx < n and 0 <= ny < m and visit[nx][ny] == 0: + visit[nx][ny] = 1 + dfs(nx, ny, cnt + 1, num + s[nx][ny]) + visit[nx][ny] = 0 + +# 빠큐값만 따로계산해서 max치 비교(빠큐는 DFS로 탐색되는 모양이 아니기 때문.) +def middlefinger(x, y): + global result + for i in mfinger: + try: + num = s[x][y] + s[x + i[0][0]][y + i[0][1]] + s[x + i[1][0]][y + i[1][1]] + s[x + i[2][0]][y + i[2][1]] + except: + num = 0 + result = max(result, num) + +# matrix 입력 +for i in range(n): + s.append(list(map(int, input().split()))) + +# 탐색 전 result 초기화 +result = 0 +# 모든 점에 대해 dfs및 빠큐탐색 진행. +for i in range(n): + for j in range(m): + visit[i][j] = 1 + dfs(i, j, 1, s[i][j]) + visit[i][j] = 0 + middlefinger(i, j) +print(result) \ No newline at end of file diff --git "a/1476\353\202\240\354\247\234\352\263\204\354\213\274.py" "b/1476\353\202\240\354\247\234\352\263\204\354\213\274.py" new file mode 100644 index 0000000..02dfc0b --- /dev/null +++ "b/1476\353\202\240\354\247\234\352\263\204\354\213\274.py" @@ -0,0 +1,21 @@ +import sys +input = sys.stdin.readline + + +# E 1~15, S 1~28, M 1~19 +E,S,M = map(int,input().split()) +cnt=0 +while 1: + if E==S and S==M: + print(cnt + E) + break + E -= 1 + S -= 1 + M -= 1 + if E==0: + E=15 + if S==0: + S=28 + if M==0: + M=19 + cnt+=1 \ No newline at end of file diff --git "a/14889\354\212\244\355\203\200\355\212\270\354\231\200\353\247\201\355\201\254.py" "b/14889\354\212\244\355\203\200\355\212\270\354\231\200\353\247\201\355\201\254.py" new file mode 100644 index 0000000..1139285 --- /dev/null +++ "b/14889\354\212\244\355\203\200\355\212\270\354\231\200\353\247\201\355\201\254.py" @@ -0,0 +1,32 @@ +import sys + +input = sys.stdin.readline + +def dfs(idx, cnt): + global ans + # 반 나눠지면 start, link팀 합 구해서 차이 절댓값의 최솟값 전역변수 ans에 최신화 시켜줌. + if cnt == n // 2: + start, link = 0, 0 + for i in range(n-1): + for j in range(i+1,n): + if check[i] and check[j]: + start += a[i][j] + a[j][i] + elif not check[i] and not check[j]: + link += a[i][j] + a[j][i] + ans = min(ans, abs(start - link)) +# 그냥 check 가 1인거 반 0인거 반 나누기만함. + for i in range(idx, n): + if check[i]: + continue + check[i] = 1 + dfs(i + 1, cnt + 1) + check[i] = 0 + + +n = int(input()) +a = [list(map(int, input().split())) for _ in range(n)] + +check = [0 for _ in range(n)] +ans = sys.maxsize +dfs(0, 0) +print(ans) \ No newline at end of file diff --git "a/15552\353\271\240\353\245\270\353\215\247\354\205\210.py" "b/15552\353\271\240\353\245\270\353\215\247\354\205\210.py" new file mode 100644 index 0000000..f3ec18f --- /dev/null +++ "b/15552\353\271\240\353\245\270\353\215\247\354\205\210.py" @@ -0,0 +1,6 @@ +import sys +input = sys.stdin.readline + +for test in range(int(input())): + a,b = map(int,input().split()) + print(a+b) \ No newline at end of file diff --git "a/15649(1)\354\210\234\354\227\264\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254.py" "b/15649(1)\354\210\234\354\227\264\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254.py" new file mode 100644 index 0000000..dedf3e5 --- /dev/null +++ "b/15649(1)\354\210\234\354\227\264\353\235\274\354\235\264\353\270\214\353\237\254\353\246\254.py" @@ -0,0 +1,7 @@ +from itertools import permutations + +N, M = map(int, input().split()) +P = permutations(range(1, N+1), M) # iter(tuple) + +for i in P: + print(*i) \ No newline at end of file diff --git a/15649NM(1).py b/15649NM(1).py new file mode 100644 index 0000000..e37ed4a --- /dev/null +++ b/15649NM(1).py @@ -0,0 +1,17 @@ +N, M = map(int, input().split()) +visited = [False] * N # 탐사 여부 check +out = [] # 출력 내용 + +def solve(depth, N, M): + if depth == M: # 탈출 조건 + print(' '.join(map(str, out))) # list를 str으로 합쳐 출력 + return + for i in range(len(visited)): # 탐사 check 하면서 + if not visited[i]: # 탐사 안했다면 + visited[i] = True # 탐사 시작(중복 제거) + out.append(i+1) # 탐사 내용 + solve(depth+1, N, M) # 깊이 우선 탐색 + visited[i] = False # 깊이 탐사 완료 + out.pop() # 탐사 내용 제거 + +solve(0, N, M) \ No newline at end of file diff --git "a/15649NM(1)_2\355\212\270.py" "b/15649NM(1)_2\355\212\270.py" new file mode 100644 index 0000000..52d7d52 --- /dev/null +++ "b/15649NM(1)_2\355\212\270.py" @@ -0,0 +1,15 @@ +# 15649 +n,m = list(map(int,input().split())) +s = [] +def dfs(): + if len(s)==m: + print(' '.join(map(str,s))) + return + + for i in range(1,n+1): + if i not in s: + s.append(i) + dfs() + s.pop() +dfs() + diff --git a/15650NM(2).py b/15650NM(2).py new file mode 100644 index 0000000..968c515 --- /dev/null +++ b/15650NM(2).py @@ -0,0 +1,15 @@ +# 15650번 +# start를 써주어 맨앞 숫자보다 큰 숫자만 검사. +n,m = list(map(int,input().split())) +s = [] +def dfs(start): + if len(s)==m: + print(' '.join(map(str,s))) + return + + for i in range(start,n+1): + if i not in s: + s.append(i) + dfs(i+1) + s.pop() +dfs(1) \ No newline at end of file diff --git a/15651NM(3).py b/15651NM(3).py new file mode 100644 index 0000000..9901450 --- /dev/null +++ b/15651NM(3).py @@ -0,0 +1,14 @@ + +n,m = list(map(int,input().split())) +s = [] + +def dfs(depth): + if len(s)==m: + print(' '.join(map(str,s))) + return + + for i in range(1,n+1): + s.append(i) + dfs(depth+1) + s.pop() +dfs(0) \ No newline at end of file diff --git a/15652NM(4).py b/15652NM(4).py new file mode 100644 index 0000000..7594bb8 --- /dev/null +++ b/15652NM(4).py @@ -0,0 +1,14 @@ + +n,m = list(map(int,input().split())) +s = [] + +def dfs(start): + if len(s)==m: + print(' '.join(map(str,s))) + return + + for i in range(start,n+1): + s.append(i) + dfs(i) + s.pop() +dfs(1) \ No newline at end of file diff --git a/15654NM(5).py b/15654NM(5).py new file mode 100644 index 0000000..dc821ff --- /dev/null +++ b/15654NM(5).py @@ -0,0 +1,19 @@ + +def DFS(depth): + if depth == M: + print(*ans) + return + for i in range(N): + if not checks[i]: + checks[i] = 1 + ans.append(nums[i]) + DFS(depth+1) + ans.pop() + checks[i] = 0 + +N,M = map(int,input().split()) +nums = list(map(int,input().split())) +nums.sort() +checks = [0 for _ in range(N)] +ans = [] +DFS(0) \ No newline at end of file diff --git a/15655NM(6).py b/15655NM(6).py new file mode 100644 index 0000000..2fe7f84 --- /dev/null +++ b/15655NM(6).py @@ -0,0 +1,18 @@ +def dfs(start,depth): + if depth==M: + print(*ans) + return + for i in range(start,N): + if not check[i]: + check[i] = 1 + ans.append(lis[i]) + dfs(i+1,depth+1) + ans.pop() + check[i]=0 + +N,M = map(int,input().split()) +lis = list(map(int,input().split())) +lis.sort() +check = [0]*N +ans = [] +dfs(0,0) \ No newline at end of file diff --git a/15656NM(7).py b/15656NM(7).py new file mode 100644 index 0000000..cd7a78a --- /dev/null +++ b/15656NM(7).py @@ -0,0 +1,15 @@ +def dfs(depth): + if depth==M: + print(*ans) + return + for i in range(N): + ans.append(lis[i]) + #탐색 start값을 i보다 큰값으로 주겠다. + dfs(depth+1) + ans.pop() + +N,M = map(int,input().split()) +lis = list(map(int,input().split())) +lis.sort() +ans = [] +dfs(0) \ No newline at end of file diff --git a/15657NM(8).py b/15657NM(8).py new file mode 100644 index 0000000..c7cd680 --- /dev/null +++ b/15657NM(8).py @@ -0,0 +1,14 @@ +def dfs(start,depth): + if depth==M: + print(*ans) + return + for i in range(start,N): + ans.append(lis[i]) + dfs(i,depth+1) + ans.pop() + +N,M = map(int,input().split()) +lis = list(map(int,input().split())) +lis.sort() +ans = [] +dfs(0,0) \ No newline at end of file diff --git "a/15661\353\247\201\355\201\254\354\231\200\354\212\244\355\203\200\355\212\270.py" "b/15661\353\247\201\355\201\254\354\231\200\354\212\244\355\203\200\355\212\270.py" new file mode 100644 index 0000000..1139285 --- /dev/null +++ "b/15661\353\247\201\355\201\254\354\231\200\354\212\244\355\203\200\355\212\270.py" @@ -0,0 +1,32 @@ +import sys + +input = sys.stdin.readline + +def dfs(idx, cnt): + global ans + # 반 나눠지면 start, link팀 합 구해서 차이 절댓값의 최솟값 전역변수 ans에 최신화 시켜줌. + if cnt == n // 2: + start, link = 0, 0 + for i in range(n-1): + for j in range(i+1,n): + if check[i] and check[j]: + start += a[i][j] + a[j][i] + elif not check[i] and not check[j]: + link += a[i][j] + a[j][i] + ans = min(ans, abs(start - link)) +# 그냥 check 가 1인거 반 0인거 반 나누기만함. + for i in range(idx, n): + if check[i]: + continue + check[i] = 1 + dfs(i + 1, cnt + 1) + check[i] = 0 + + +n = int(input()) +a = [list(map(int, input().split())) for _ in range(n)] + +check = [0 for _ in range(n)] +ans = sys.maxsize +dfs(0, 0) +print(ans) \ No newline at end of file diff --git a/15663NM(9).py b/15663NM(9).py new file mode 100644 index 0000000..d976808 --- /dev/null +++ b/15663NM(9).py @@ -0,0 +1,22 @@ +def dfs(depth): + if depth==M: + print(*ans) + return + same = 0 + for i in range(N): + if not check[i] and same != lis[i]: + ans.append(lis[i]) + check[i] = True + same = lis[i] + dfs(depth+1) + ans.pop() + check[i] = False + # 9,9가 되는 이유는 뒤의 9의 전값은 9가 아니라 7이기 때문(7탐색후 9탐색을 들어갔기 때문에.) +N,M = map(int,input().split()) +lis = list(map(int,input().split())) + +lis.sort() +check = [False]*N +ans = [] + +dfs(0) diff --git a/15664NM(10).py b/15664NM(10).py new file mode 100644 index 0000000..86b5b4b --- /dev/null +++ b/15664NM(10).py @@ -0,0 +1,25 @@ +import sys +input = sys.stdin.readline + +N,M = map(int,input().split()) +nums = list(map(int,input().split())) +ans =[] +check = [False]*N +nums.sort() +# 중복 x 비내림차순 조합.. + +def dfs(start,depth): + if depth == M: + print(*ans) + return + same = 0 + for i in range(start,N): + if not check[i] and same != nums[i]: + ans.append(nums[i]) + check[i] = True + same = nums[i] + dfs(i+1,depth+1) + check[i]=False + ans.pop() + +dfs(0,0) \ No newline at end of file diff --git a/15665NM(11).py b/15665NM(11).py new file mode 100644 index 0000000..3e554df --- /dev/null +++ b/15665NM(11).py @@ -0,0 +1,22 @@ +import sys +input = sys.stdin.readline + +N,M = map(int,input().split()) +nums = list(map(int,input().split())) +ans =[] +nums.sort() +# 같은수 여러번 + +def dfs(depth): + if depth == M: + print(*ans) + return + same = 0 + for i in range(N): + if same != nums[i]: + ans.append(nums[i]) + same = nums[i] + dfs(depth+1) + ans.pop() + +dfs(0) \ No newline at end of file diff --git a/15666NM(12).py b/15666NM(12).py new file mode 100644 index 0000000..061c594 --- /dev/null +++ b/15666NM(12).py @@ -0,0 +1,23 @@ +import sys +input = sys.stdin.readline + +N,M = map(int,input().split()) +nums = list(map(int,input().split())) +ans =[] +nums.sort() +# 중복 x 비내림차순 조합.. + +def dfs(start,depth): + if depth == M: + print(*ans) + return + same = 0 + for i in range(start,N): + if same != nums[i]: + ans.append(nums[i]) + same = nums[i] + # i +1안해주면 자기자신부터 시작(중복가능) + dfs(i,depth+1) + ans.pop() + +dfs(0,0) \ No newline at end of file diff --git a/15988.py b/15988.py new file mode 100644 index 0000000..e85c9a2 --- /dev/null +++ b/15988.py @@ -0,0 +1,14 @@ +import sys +input = sys.stdin.readline + +dp = [0 for i in range(1000001)] +dp[0] = 1 +dp[1] = 1 +dp[2] = 2 +for i in range(3, 1000001): + dp[i] = dp[i - 1] % 1000000009 + dp[i - 2] % 1000000009 + dp[i - 3] % 1000000009 + +t = int(input()) +for i in range(t): + n = int(input()) + print(dp[n] % 1000000009) \ No newline at end of file diff --git "a/15988_123\353\215\224\355\225\230\352\270\260.py" "b/15988_123\353\215\224\355\225\230\352\270\260.py" new file mode 100644 index 0000000..85965f8 --- /dev/null +++ "b/15988_123\353\215\224\355\225\230\352\270\260.py" @@ -0,0 +1,21 @@ +import sys +input = sys.stdin.readline + +def findCase(n): + dp[1] = 1 + dp[2] = 2 + dp[3] = 4 + if n>3: + for i in range(4,n+1): + if dp[i]: + continue + dp[i] = (dp[i-1] + dp[i-2] + dp[i-3])%1000000009 + return dp[n] + +T = int(input()) +dp = [0] * 1000001 + +for test in range(T): + n = int(input()) + + print(findCase(n)) \ No newline at end of file diff --git "a/15990 \353\215\224\355\225\230\352\270\2605.py" "b/15990 \353\215\224\355\225\230\352\270\2605.py" new file mode 100644 index 0000000..90fdee6 --- /dev/null +++ "b/15990 \353\215\224\355\225\230\352\270\2605.py" @@ -0,0 +1,15 @@ +class A: + def __init__(self, name): + self.name=name + +class B(A): + gene = 'XX' + +class C(A): + gene = 'XY' + +class D(B,C): + pass + +baby = D('baby') +print(baby.gene) \ No newline at end of file diff --git "a/16194\354\271\264\353\223\234\352\265\254\353\247\244\355\225\230\352\270\2602.py" "b/16194\354\271\264\353\223\234\352\265\254\353\247\244\355\225\230\352\270\2602.py" new file mode 100644 index 0000000..97ee37a --- /dev/null +++ "b/16194\354\271\264\353\223\234\352\265\254\353\247\244\355\225\230\352\270\2602.py" @@ -0,0 +1,14 @@ +N = int(input()) + +p = [0] + list(map(int,input().split())) +dp = [False for _ in range(N+1)] + + +for i in range(1, N+1): + for k in range(1, i+1): + if dp[i] == False : + dp[i] = dp[i-k]+p[k] + else : + dp[i] = min(dp[i], dp[i-k]+p[k]) + +print(dp[N]) \ No newline at end of file diff --git "a/1676\355\214\251\355\206\240\353\246\254\354\226\27490.py" "b/1676\355\214\251\355\206\240\353\246\254\354\226\27490.py" new file mode 100644 index 0000000..43c44eb --- /dev/null +++ "b/1676\355\214\251\355\206\240\353\246\254\354\226\27490.py" @@ -0,0 +1,2 @@ +N = int(input()) +print(N//5 + N//25 + N//125) \ No newline at end of file diff --git a/16929two_Dots.py b/16929two_Dots.py new file mode 100644 index 0000000..6176b64 --- /dev/null +++ b/16929two_Dots.py @@ -0,0 +1,43 @@ +import sys +input = sys.stdin.readline + +dx = [-1, 1, 0, 0] # 상하좌우 +dy = [0, 0, -1, 1] + +def DFS(x, y): + global answer + visited[x][y] = 1 # 방문 체크 + for d in range(4): + X = x + dx[d] + Y = y + dy[d] + if 0 <= X < N and 0 <= Y < M: # 다음 타겟이 matrix 안에 있으면 + if matrix[X][Y] == matrix[x][y]: # 값(색깔)이 같으면 + if visited[X][Y] == 0: # 아직 방문한 적이 없다면 + my_snake.append([X, Y]) #방문 순서에 기록한다 + DFS(X, Y) # 방문하러 가기 (재귀) + my_snake.pop() # 방문 순서에서 제외한다 + else: # 방문한 적이 있다면 + if X == my_snake[-2][0] and Y == my_snake[-2][1]: # 바로 전에 방문한 곳이면 + pass + else: # 바로 전은 아닌데 언젠가 방문한 적이 있음 (사이클 형성) + answer = 'Yes' # 답을 바꾸고 바로 빠져나간다 + return + if answer == 'Yes': + return + +N, M = map(int, input().split()) +matrix = [list(input()) for _ in range(N)] +visited = [[0]*M for _ in range(N)] # 방문 체크용 +answer = 'No' # 기본값은 No + +for i in range(N): + for j in range(M): + if visited[i][j] == 0: # 해당 구역을 방문한 적이 없다면 + my_snake = [[i, j]] # 방문 순서 기록용 + DFS(i, j) + if answer == 'Yes': # 답이 바뀌면 바로 빠져나온다. + break + if answer == 'Yes': + break + +print(answer) \ No newline at end of file diff --git "a/16929two_Dots_\354\235\264\354\240\204\352\260\222\354\240\200\354\236\245\353\260\251\354\213\235.py" "b/16929two_Dots_\354\235\264\354\240\204\352\260\222\354\240\200\354\236\245\353\260\251\354\213\235.py" new file mode 100644 index 0000000..4daec27 --- /dev/null +++ "b/16929two_Dots_\354\235\264\354\240\204\352\260\222\354\240\200\354\236\245\353\260\251\354\213\235.py" @@ -0,0 +1,36 @@ +N,M=map(int,input().split()) +arr=[list(map(str,input()))for _ in range(N)] +visited = [[False]*M for _ in range(N)] + +dy=[0,0,1,-1] +dx=[1,-1,0,0] +flag=False + +def scope(y,x): + if y>=0 and y=0 and x= 0: + cache[cv] = 2 + return result if cv != result else -1 + + return -1 + + +def bfs(): + q = [] + for i in range(n): + if cache[i] == 2: + q.append(i) + dist[i] = 0 + + while q: + tmp = [] + + for cv in q: + for nv in grid[cv]: + if dist[nv] != -1: continue + dist[nv] = dist[cv] + 1 + tmp.append(nv) + + q = tmp + + + +n = int(input()) +grid = [[] for _ in range(n)] +cache = [0]*n +dist = [-1]*n + +for _ in range(n): + a,b = map(int, input().split()) + grid[a-1].append(b-1) + grid[b-1].append(a-1) + +dfs(0,-1) +bfs() +print(*dist) + +""" +0 : 미방문 +1 : 방문 +-1 : 사이클 x +2 : 사이클 +""" diff --git "a/16947\354\247\200\355\225\230\354\262\2402.py" "b/16947\354\247\200\355\225\230\354\262\2402.py" new file mode 100644 index 0000000..2bdc29a --- /dev/null +++ "b/16947\354\247\200\355\225\230\354\262\2402.py" @@ -0,0 +1,52 @@ +import sys +from collections import deque +sys.setrecursionlimit(10**9) + +# DFS를 통해 사이클 찾기 + +def dfs(x, cnt): + # 이미 방문한 노드인데 거리차가 3 이상일 경우 사이클 + if check[x]: + if cnt - dist[x] >= 3: + return x + else: return -1 + check[x] = 1 + dist[x] = cnt + for y in adj_list[x]: + cycleStartNode = dfs(y, cnt + 1) + if cycleStartNode != -1: + check[x] = 2 + if x == cycleStartNode: return -1 + else: return cycleStartNode + return -1 + +if __name__ == '__main__': + N = int(input()) + adj_list = [[] * (N + 1) for _ in range(N + 1)] + # check[i] = 0 : 방문하지 않은 노드 + # check[i] = 1 : 방문한 노드 + # check[i] = 2 : 사이클에 속하는 노드 + check = [0] * (N + 1) + dist = [0] * (N + 1) + + for _ in range(N): + u, v = map(int, sys.stdin.readline().split()) + adj_list[u].append(v) + adj_list[v].append(u) + # 사이클 찾기 + dfs(1, 0) + # BFS를 통해 사이클까지의 거리 계산하기 + q = deque() + for i in range(1, N + 1): + if check[i] == 2: + q.append(i) + dist[i] = 0 + else: + dist[i] = -1 + while q: + x = q.popleft() + for y in adj_list[x]: + if dist[y] == -1: + q.append(y) + dist[y] = dist[x] + 1 + print(' '.join(map(str, dist[1:]))) \ No newline at end of file diff --git "a/16947\354\247\200\355\225\230\354\262\2403.py" "b/16947\354\247\200\355\225\230\354\262\2403.py" new file mode 100644 index 0000000..e69de29 diff --git "a/1697\354\210\250\353\260\224\352\274\255\354\247\210_\352\260\210\353\246\274\352\270\270 \355\203\220\354\203\211(\354\202\254\353\260\251\355\203\220\354\203\211)\354\225\204\354\235\264\353\224\224\354\226\264.py" "b/1697\354\210\250\353\260\224\352\274\255\354\247\210_\352\260\210\353\246\274\352\270\270 \355\203\220\354\203\211(\354\202\254\353\260\251\355\203\220\354\203\211)\354\225\204\354\235\264\353\224\224\354\226\264.py" new file mode 100644 index 0000000..c3eaf8c --- /dev/null +++ "b/1697\354\210\250\353\260\224\352\274\255\354\247\210_\352\260\210\353\246\274\352\270\270 \355\203\220\354\203\211(\354\202\254\353\260\251\355\203\220\354\203\211)\354\225\204\354\235\264\353\224\224\354\226\264.py" @@ -0,0 +1,24 @@ +import sys +input = sys.stdin.readline +from collections import deque + + +N,K = map(int,input().split()) +queue = deque() +time = [0] * (100001) + +def BFS(): + queue.append(N) + while queue: + v= queue.popleft() + if v == K: + return time[v] + for next_step in (v-1, v+1, v*2): + if 0 <= next_step < 100001 and not time[next_step]: + time[next_step] = time[v] + 1 + queue.append(next_step) + +if N <= K: + print(BFS()) +else: + print(N-K) \ No newline at end of file diff --git "a/1699\354\240\234\352\263\261\354\210\230\354\235\230\355\225\251.py" "b/1699\354\240\234\352\263\261\354\210\230\354\235\230\355\225\251.py" new file mode 100644 index 0000000..a970693 --- /dev/null +++ "b/1699\354\240\234\352\263\261\354\210\230\354\235\230\355\225\251.py" @@ -0,0 +1,12 @@ +n = int(input()) +dp = [0] * (n+1) +square = [i * i for i in range(1, 317)] + +for i in range(1, n + 1): + s = [] + for j in square: + if j > i: + break + s.append(dp[i - j]) + dp[i] = min(s) + 1 +print(dp[n]) \ No newline at end of file diff --git "a/1707\354\235\264\353\266\204_\352\267\270\353\236\230\355\224\204.py" "b/1707\354\235\264\353\266\204_\352\267\270\353\236\230\355\224\204.py" new file mode 100644 index 0000000..0f06491 --- /dev/null +++ "b/1707\354\235\264\353\266\204_\352\267\270\353\236\230\355\224\204.py" @@ -0,0 +1,46 @@ +import sys +input = sys.stdin.readline +from collections import defaultdict +from collections import deque + + +def BFS(v): + queue.append(v) + check[v] = 1 + while queue: + v = queue.popleft() + for i in graph[v]: + if check[i] ==0: + if check[v]==1: + check[i]= -1 + else: + check[i] = 1 + queue.append(i) + + + +for test in range(int(input())): + V,E = map(int,input().split()) + graph = defaultdict(list) + queue = deque() + check = [0]*(V+1) + ans = 0 + + for _ in range(E): + a,b = map(int,input().split()) + graph[a] +=[b] + graph[b] +=[a] + + for i in range(1,V+1): + if check[i] ==0: + BFS(i) + + for i in range(1,V+1): + for adj in graph[i]: + if check[i]==check[adj]: + ans = 1 + + if ans==0: + print("YES") + else: + print("NO") \ No newline at end of file diff --git "a/17087\354\210\250\353\260\224\352\274\255\354\247\2106.py" "b/17087\354\210\250\353\260\224\352\274\255\354\247\2106.py" new file mode 100644 index 0000000..829e4ae --- /dev/null +++ "b/17087\354\210\250\353\260\224\352\274\255\354\247\2106.py" @@ -0,0 +1,24 @@ +def GCD(i,j): + a, b = i,j + + + while b != 0: + a = a % b + a, b = b, a + return a + +N,S = map(int,input().split()) +A = list(map(int, input().split())) + +for i in range(N): + if A[i]>=S: + A[i] = A[i]-S + else: + A[i] = S-A[i] + +init_GCD = A[0] + +for i in range(1,N): + init_GCD = GCD(init_GCD,A[i]) + +print(init_GCD) \ No newline at end of file diff --git "a/17103\352\263\250\353\223\234\353\260\224\355\235\220\355\214\214\355\213\260\354\205\230_\354\213\234\352\260\204\354\264\210\352\263\274.py" "b/17103\352\263\250\353\223\234\353\260\224\355\235\220\355\214\214\355\213\260\354\205\230_\354\213\234\352\260\204\354\264\210\352\263\274.py" new file mode 100644 index 0000000..0716b5a --- /dev/null +++ "b/17103\352\263\250\353\223\234\353\260\224\355\235\220\355\214\214\355\213\260\354\205\230_\354\213\234\352\260\204\354\264\210\352\263\274.py" @@ -0,0 +1,20 @@ +import sys +input = sys.stdin.readline + +def isPrime(num): + for i in range(2, int(num**0.5)+1): + if num%i == 0: + return False + return True + +T = int(input()) + + +for test in range(T): + N = int(input()) + cnt = 0 + for i in range(2, int(N/2)+1): + if isPrime(i) and isPrime(N-i): + cnt+=1 + print(cnt) + \ No newline at end of file diff --git "a/17103\352\263\250\353\223\234\353\260\224\355\235\220\355\214\214\355\213\260\354\205\230_\354\260\270\352\263\240\354\275\224\353\223\234.py" "b/17103\352\263\250\353\223\234\353\260\224\355\235\220\355\214\214\355\213\260\354\205\230_\354\260\270\352\263\240\354\275\224\353\223\234.py" new file mode 100644 index 0000000..d1fd5a3 --- /dev/null +++ "b/17103\352\263\250\353\223\234\353\260\224\355\235\220\355\214\214\355\213\260\354\205\230_\354\260\270\352\263\240\354\275\224\353\223\234.py" @@ -0,0 +1,23 @@ +prime_arr = [] + +# sieve = 체 +sieve = [False, False] + ([True] * (1000000 - 1)) +for i in range(2, 1000001): + if sieve[i]: + prime_arr.append(i) + for j in range(i * 2, 1000001, i): + sieve[j] = False + +ans = [] +for tc in range(int(input())): + + N = int(input()) + cnt = 0 + for i in range(len(prime_arr)): + if prime_arr[i] > N - prime_arr[i]: + break + if sieve[N - prime_arr[i]]: + cnt += 1 + ans.append(cnt) + +print(*ans, sep='\n') \ No newline at end of file diff --git "a/17123\353\260\260\354\227\264\353\206\200\354\235\264.py" "b/17123\353\260\260\354\227\264\353\206\200\354\235\264.py" new file mode 100644 index 0000000..f145501 --- /dev/null +++ "b/17123\353\260\260\354\227\264\353\206\200\354\235\264.py" @@ -0,0 +1,23 @@ +import sys +input = sys.stdin.readline + +T = int(input()) + +for test in range(T): + N,M = map(int,input().split()) + matrix = [list(map(int,input().split())) for _ in range(N)] + + + for _ in range(M): + r1,c1,r2,c2,v = map(int,input().split()) + for i in range(r1-1,r2): + for j in range(c1-1,c2): + matrix[i][j] +=v + + + for i in range(N): + print(sum(matrix[i]), end=" ") + print() + for j in range(N): + print(sum(matrix[m][j] for m in range(N)), end=" ") + print() \ No newline at end of file diff --git "a/17123\353\260\260\354\227\264\353\206\200\354\235\264_2\354\260\250\354\213\234.py" "b/17123\353\260\260\354\227\264\353\206\200\354\235\264_2\354\260\250\354\213\234.py" new file mode 100644 index 0000000..a7de931 --- /dev/null +++ "b/17123\353\260\260\354\227\264\353\206\200\354\235\264_2\354\260\250\354\213\234.py" @@ -0,0 +1,24 @@ +import sys +input = sys.stdin.readline + + + +for test in range(int(input())): + N,M = map(int,input().split()) + matrix = [list(map(int,input().split())) for _ in range(N)] + ans = [[] for _ in range(2)] + for i in range(N): + ans[0].append(sum(matrix[i])) + for i in range(N): + ans[1].append(sum(matrix[m][i] for m in range(N))) + for _ in range(M): + r1,c1,r2,c2,v = map(int,input().split()) + # c1~c2행까지 (r2-r1)*v만큼 증가. + for i in range(r1-1,r2): + ans[0][i] += (c2-c1+1)*v + # r1~r2열까지 (c2-c1)*v만큼 증가. + for i in range(c1-1,c2): + ans[1][i] += (r2-r1+1)*v + + for i in range(2): + print(*ans[i]) \ No newline at end of file diff --git "a/1717\354\247\221\355\225\251\354\235\230\355\221\234\355\230\204.py" "b/1717\354\247\221\355\225\251\354\235\230\355\221\234\355\230\204.py" new file mode 100644 index 0000000..d234e9b --- /dev/null +++ "b/1717\354\247\221\355\225\251\354\235\230\355\221\234\355\230\204.py" @@ -0,0 +1,35 @@ +import sys +input = sys.stdin.readline +sys.setrecursionlimit(100000) + +n,m = map(int,input().split()) +parent = [i for i in range(n+1)] + +def Union(a,b): + a = Find(a) + b = Find(b) + + if a>b: + parent[a] = b + else: + parent[b] = a + +def Find(u): + if parent[u]==u: + return u + parent[u] = Find(parent[u]) + return parent[u] + + + +for _ in range(m): + flag, x, y = map(int,input().split()) + + if flag: + if Find(x) == Find(y): + print("YES") + else: + print("NO") + else: + Union(x,y) + \ No newline at end of file diff --git a/17298.py b/17298.py new file mode 100644 index 0000000..2518400 --- /dev/null +++ b/17298.py @@ -0,0 +1,44 @@ +import sys +input = sys.stdin.readline + + + +A = int(input()) +An = list(map(int,input().split())) + +stack = [] +result = [-1]*A + +stack.append(0) +i = 1 + +# i 즉 인덱스가 A-1때까지 돌린다. +while stack and i < A: + # 큰걸찾으면 stack에서 빠지면서 result에 저장해. + # stack에 차있던것들(오큰수 못찾았던 것들) 쭉 비우면서 진행 + # An[i]보다 크거나 작은수 나오면 스탑하고 다시 stack채우기 진행. + # 결국 끝까지stack에 남으면 -1 + while stack and An[stack[-1]] < An[i]: + result[stack[-1]] = An[i] + print(stack, result) + stack.pop() + + stack.append(i) + i+=1 + print(stack, result) + +for i in result: + print(i, end = " ") + +# answer = "" +# for i in range(A): +# if i==A-1: +# answer += "-1" +# break +# for j in range(i+1,A): +# if(An[i]=An[j]): +# answer += "-1 " +# print(answer) \ No newline at end of file diff --git a/17299.py b/17299.py new file mode 100644 index 0000000..92a6113 --- /dev/null +++ b/17299.py @@ -0,0 +1,8 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +A = list(map(int,input().split())) +num=[] +for i in range(N): + num.append(int(input())) \ No newline at end of file diff --git "a/17404RGB\352\261\260\353\246\2542.py" "b/17404RGB\352\261\260\353\246\2542.py" new file mode 100644 index 0000000..49dab55 --- /dev/null +++ "b/17404RGB\352\261\260\353\246\2542.py" @@ -0,0 +1,22 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +price = [list(map(int,input().split())) for _ in range(N)] +dp = [[1001,1001,1001] for _ in range(N+1)] +ans = [] + +for init in range(3): + dp[1][init] = price[0][init] + dp[1][(init+1)%3] = 3001 + dp[1][(init+2)%3] = 3001 + + for i in range(2,N+1): + dp[i][0] = min(dp[i-1][1]+price[i-1][0],dp[i-1][2]+price[i-1][0]) + dp[i][1] = min(dp[i-1][0]+price[i-1][1],dp[i-1][2]+price[i-1][1]) + dp[i][2] = min(dp[i-1][0]+price[i-1][2],dp[i-1][1]+price[i-1][2]) + + dp[N][init] = 1000001 + ans.append(min(dp[N])) + +print(min(ans)) \ No newline at end of file diff --git a/17413.py b/17413.py new file mode 100644 index 0000000..5148cd8 --- /dev/null +++ b/17413.py @@ -0,0 +1,25 @@ +S = list(input()) +main = '' +check = 0 +stack = [] +for i in range(len(S)): + if check == 0: + if S[i] == "<": + check = 1 + while stack: + main += stack.pop() + main += S[i] + elif S[i] == " ": + while stack: + main += stack.pop() + main += S[i] + else: + stack.append(S[i]) + else: + main += S[i] + if S[i] ==">": + check=0 +while stack: + main += stack.pop() + +print(main) \ No newline at end of file diff --git "a/1748\354\210\230\354\235\264\354\226\264\354\223\260\352\270\260.py" "b/1748\354\210\230\354\235\264\354\226\264\354\223\260\352\270\260.py" new file mode 100644 index 0000000..798aa36 --- /dev/null +++ "b/1748\354\210\230\354\235\264\354\226\264\354\223\260\352\270\260.py" @@ -0,0 +1,26 @@ +import sys +input = sys.stdin.readline + +N = int(input()) + +if N//1000000000 != 0: + ans = 10 + 9*900000000 + 8*90000000 + 7*9000000 + 6*900000 + 5*90000 + 4*9000 + 3*900 + 2*90 + 1*9 +elif N//100000000 != 0: + ans = 9*(N-99999999) + 8*90000000 + 7*9000000 + 6*900000 + 5*90000 + 4*9000 + 3*900 + 2*90 + 1*9 +elif N//10000000 != 0: + ans = 8*(N-9999999) + 7*9000000 + 6*900000 + 5*90000 + 4*9000 + 3*900 + 2*90 + 1*9 +elif N//1000000 !=0: + ans = 7*(N-999999) + 6*900000 + 5*90000 + 4*9000 + 3*900 + 2*90 + 1*9 +elif N//100000 !=0: + ans = 6*(N-99999) + 5*90000 + 4*9000 + 3*900 + 2*90 + 1*9 +elif N//10000 !=0: + ans = 5*(N-9999) + 4*9000 + 3*900 + 2*90 + 1*9 +elif N//1000 !=0: + ans = 4*(N-999) + 3*900 + 2*90 + 1*9 +elif N//100 !=0: + ans = 3*(N-99) + 2*90 + 1*9 +elif N//10 !=0: + ans = 2*(N-9) + 1*9 +else: + ans = 1*N +print(ans) diff --git "a/1918_\355\233\204\354\234\204\355\221\234\352\270\260.py" "b/1918_\355\233\204\354\234\204\355\221\234\352\270\260.py" new file mode 100644 index 0000000..ebc68c6 --- /dev/null +++ "b/1918_\355\233\204\354\234\204\355\221\234\352\270\260.py" @@ -0,0 +1,28 @@ + +a = input() +stack = [] #스택 +res='' #출력 + +for x in a: + if x.isalpha(): #피연산자인지 아닌지 확인 + res+=x + else: + if x == '(': + stack.append(x) + elif x == '*' or x =='/': + while stack and (stack[-1]=='*' or stack[-1]=='/'): + res+=stack.pop() + stack.append(x) + elif x == '+' or x == '-': + while stack and stack[-1] != '(': + res += stack.pop() + stack.append(x) + elif x == ')': + while stack and stack[-1] != '(': + res+=stack.pop() + stack.pop() + +#스택안에 남아있는 값들 pop +while stack: + res += stack.pop() +print(res) \ No newline at end of file diff --git "a/1929\354\206\214\354\210\230\354\260\276\352\270\260.py" "b/1929\354\206\214\354\210\230\354\260\276\352\270\260.py" new file mode 100644 index 0000000..7161761 --- /dev/null +++ "b/1929\354\206\214\354\210\230\354\260\276\352\270\260.py" @@ -0,0 +1,14 @@ +def isPrime(num): + if num==1: + return False + else: + for i in range(2, int(num**0.5)+1): + if num%i == 0: + return False + return True + +M, N = map(int, input().split()) + +for i in range(M, N+1): + if isPrime(i): + print(i) \ No newline at end of file diff --git "a/1934 \354\234\240\355\201\264\353\246\254\353\223\234\355\230\270\354\240\234\353\262\225.py" "b/1934 \354\234\240\355\201\264\353\246\254\353\223\234\355\230\270\354\240\234\353\262\225.py" new file mode 100644 index 0000000..2748e01 --- /dev/null +++ "b/1934 \354\234\240\355\201\264\353\246\254\353\223\234\355\230\270\354\240\234\353\262\225.py" @@ -0,0 +1,12 @@ + +N = int(input()) +num = list(map(int,input().split())) +cnt = 0 + +for i in range(N): + for j in range(2,i): + if num[i]%j==0: + break + cnt+=1 + +print(cnt) \ No newline at end of file diff --git "a/1935_\355\233\204\354\234\204\355\221\234\352\270\260\354\213\235.py" "b/1935_\355\233\204\354\234\204\355\221\234\352\270\260\354\213\235.py" new file mode 100644 index 0000000..b3f1895 --- /dev/null +++ "b/1935_\355\233\204\354\234\204\355\221\234\352\270\260\354\213\235.py" @@ -0,0 +1,33 @@ + + +import sys +input = sys.stdin.readline + +n=int(input()) +str=input().rstrip() +nums=[0]*n +for i in range(n): + nums[i]=int(input().rstrip()) +stack=[] + +for ch in str: + #문자이면 + if ch.isupper(): + #nums[해당 문자의 아스키코드에 해당하는 index] + stack.append(nums[ord(ch)-ord('A')]) + #연산자이면 + else: + #뒤에 추가된 숫자먼저 빼오고 + #이전에 추가된 숫자빼오기 + num2=stack.pop() + num1=stack.pop() + if ch=='+': + stack.append(num1+num2) + elif ch=='-': + stack.append(num1-num2) + elif ch=='/': + stack.append(num1/num2) + elif ch=='*': + stack.append(num1*num2) +#소수점 두자리까지 출력하는 방법 +print(f"{stack[0]:.2f}") \ No newline at end of file diff --git "a/1978\354\206\214\354\210\230\354\260\276\352\270\260.py" "b/1978\354\206\214\354\210\230\354\260\276\352\270\260.py" new file mode 100644 index 0000000..959fd79 --- /dev/null +++ "b/1978\354\206\214\354\210\230\354\260\276\352\270\260.py" @@ -0,0 +1,15 @@ + +A,B = map(int,input().split()) + +for i in range(A,B+1): + if i == 1: + continue + elif i == 2: + print(i) + continue + else: + for j in range(2,i): + if i%j==0: + break + if j==i-1: + print(i) diff --git "a/2004\354\241\260\355\225\251.py" "b/2004\354\241\260\355\225\251.py" new file mode 100644 index 0000000..3115474 --- /dev/null +++ "b/2004\354\241\260\355\225\251.py" @@ -0,0 +1,18 @@ +n, m = map(int, input().split()) + + +def two_count(n): + two = 0 + while n != 0: + n = n // 2 + two += n + return two + +def five_count(n): + five = 0 + while n != 0: + n = n // 5 + five += n + return five + +print(min(two_count(n) - two_count(n - m) - two_count(m), five_count(n) - five_count(n - m) - five_count(m))) \ No newline at end of file diff --git "a/2089_-2\354\247\204\354\210\230.py" "b/2089_-2\354\247\204\354\210\230.py" new file mode 100644 index 0000000..c1296fc --- /dev/null +++ "b/2089_-2\354\247\204\354\210\230.py" @@ -0,0 +1,18 @@ +import sys + +N = int(sys.stdin.readline()) + +if not N: + sys.stdout.write('0') + exit() +res = '' +while N: + if N%(-2): + res = '1' + res + N = N//-2 + 1 + else: + res = '0' + res + N //= -2 + +sys.stdout.write(res) + diff --git "a/2133\355\203\200\354\235\274\354\261\204\354\232\260\352\270\260.py" "b/2133\355\203\200\354\235\274\354\261\204\354\232\260\352\270\260.py" new file mode 100644 index 0000000..bcd09f2 --- /dev/null +++ "b/2133\355\203\200\354\235\274\354\261\204\354\232\260\352\270\260.py" @@ -0,0 +1,13 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +dp = [0]*31 + +dp[2] = 3 +for i in range(4,N+1,2): + dp[i] = dp[i-2]*3+2 + for j in range(4,i,2): + dp[i] += dp[i-j]*2 + +print(dp[N]) diff --git "a/2178\353\257\270\353\241\234\355\203\220\354\203\211.py" "b/2178\353\257\270\353\241\234\355\203\220\354\203\211.py" new file mode 100644 index 0000000..583509d --- /dev/null +++ "b/2178\353\257\270\353\241\234\355\203\220\354\203\211.py" @@ -0,0 +1,25 @@ +import sys +input = sys.stdin.readline +sys.setrecursionlimit(50000) +from collections import deque + +N,M = map(int,input().split()) + +matrix = [list(map(lambda x :int(x),list(map(str,input().rstrip())))) for _ in range(N)] +queue = deque() +dx = [-1,1,0,0] +dy = [0,0,1,-1] + +def BFS(x,y): + queue.append([x,y]) + matrix[x][y] = 1 + while queue: + x,y = queue.popleft() + for k in range(4): + nx = x+dx[k] + ny = y+dy[k] + if 0<=nx': + return i > j + return True + +def DFS(depth, seqs): + global max, min + if depth == n + 1: + if not len(min): + min = seqs + else: + max = seqs + return + for i in range(10): + if not check[i]: + if depth == 0 or possible(seqs[-1], str(i), inequality[depth - 1]): + check[i] = True + DFS(depth + 1, seqs + str(i)) + check[i] = False +DFS(0, "") +print(max) +print(min) \ No newline at end of file diff --git "a/2609\354\265\234\352\263\265\354\225\275\352\263\265\353\260\260.py" "b/2609\354\265\234\352\263\265\354\225\275\352\263\265\353\260\260.py" new file mode 100644 index 0000000..9a714fe --- /dev/null +++ "b/2609\354\265\234\352\263\265\354\225\275\352\263\265\353\260\260.py" @@ -0,0 +1,16 @@ +import sys + +T = int(input()) +for test in range(T): + A, B = map(int, sys.stdin.readline().split()) + a, b = A, B + + + while b != 0: + a = a % b + a, b = b, a + + + #lcm + print(a) +/ \ No newline at end of file diff --git "a/2667\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.py" "b/2667\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.py" new file mode 100644 index 0000000..39972e7 --- /dev/null +++ "b/2667\353\213\250\354\247\200\353\262\210\355\230\270\353\266\231\354\235\264\352\270\260.py" @@ -0,0 +1,39 @@ +import sys +input = sys.stdin.readline +from collections import deque + +N = int(input()) +matrix = [list(map(int,list(map(str,input().rstrip())))) for _ in range(N)] +queue = deque() +cnt = 1 +dx = [1,-1,0,0] +dy = [0,0,1,-1] +ans = [] + +def BFS(x,y,cnt): + matrix[x][y] = cnt + count = 1 + queue.append([x,y]) + while queue: + x,y = queue.popleft() + for i in range(4): + nx = x+dx[i] + ny = y+dy[i] + if 0<=nx answer: + answer = cnt + + # 행 순회하면서 연속되는 숫자 세기 + cnt=1 + for j in range(1, n): + if arr[j][i] == arr[j-1][i]: + # 이전 것과 같다면 cnt에 1 더하기 + cnt += 1 + else: + # 이전과 다르다면 다시 1로 초기화 + cnt=1 + + # 비교해서 현재 cnt가 더 크다면 answer 갱신하기 + if cnt > answer: + answer = cnt + + return answer + +n=int(input()) +arr=[list(input()) for _ in range(n)] +answer=0 + +for i in range(n): + for j in range(n): + # 열 바꾸기 + if j+1 < n: + # 인점한 것과 바꾸기 + arr[i][j], arr[i][j+1] = arr[i][j+1], arr[i][j] + + # check는 arrd에서 인점한 것과 바꿨을 때 가장 긴 연속한 부분을 찾아내는 함수이다 + temp=check(arr) + + if temp > answer: + answer = temp + + # 바꿨던 것을 다시 원래대로 돌려놓기 + arr[i][j], arr[i][j+1] = arr[i][j+1], arr[i][j] + + # 행 바꾸기 + if i+1 < n: + # 인점한 것과 바꾸기 + arr[i][j], arr[i+1][j] = arr[i+1][j], arr[i][j] + + # check는 arrd에서 인점한 것과 바꿨을 때 가장 긴 연속한 부분을 찾아내는 함수이다 + temp=check(arr) + + if temp > answer: + answer = temp + + # 바꿨던 것을 다시 원래대로 돌려놓기 + arr[i][j], arr[i+1][j] = arr[i+1][j], arr[i][j] + +print(answer) \ No newline at end of file diff --git "a/3587\354\204\261\353\203\245\352\260\234\353\271\204.py" "b/3587\354\204\261\353\203\245\352\260\234\353\271\204.py" new file mode 100644 index 0000000..d5a0553 --- /dev/null +++ "b/3587\354\204\261\353\203\245\352\260\234\353\271\204.py" @@ -0,0 +1,27 @@ +import sys +input=sys.stdin.readline + +t=int(input()) +for _ in range(t): + n=int(input()) + match=[6, 2, 5, 5, 4, 5, 6, 3, 7, 6] + ans=[0, 0, 1, 7, 4, 2, 6, 8, 10, 18, 22] + ansMax='7'*(n%2)+'1'*(n//2-(n%2)) + if n<=10: + print(ans[n], ansMax) + continue + + ansMin='' + while n>0: + n-=7 + if n>=0: ansMin+='8' + else: n+=7; break + + small={6:6, 2:1, 5:2} + if n in small: ansMin=str(small[n])+ansMin + else: + if n==1: ansMin='10'+ansMin[1:] + elif n==3: ansMin='200'+ansMin[2:] + elif n==4: ansMin='20'+ansMin[1:] + + print(ansMin, ansMax) \ No newline at end of file diff --git a/369game.py b/369game.py new file mode 100644 index 0000000..87f5833 --- /dev/null +++ b/369game.py @@ -0,0 +1,15 @@ +import itertools as it + +T = int(input()) +for test in range(T): + N = int(input()) + s = [] + print("#{}\n1".format(test+1)) + for i in range(N-1): + s.append(i) + + for j in range(i+2): + com = list(it.combinations(s,j)) + num = len(com) + print(num, end = " ") + print("") \ No newline at end of file diff --git a/4446ROT12.py b/4446ROT12.py new file mode 100644 index 0000000..52117da --- /dev/null +++ b/4446ROT12.py @@ -0,0 +1,39 @@ +moem = ['a','i','y','e','o','u'] +zaem = ['b','k','x','z','n','h','d','c','w','g','p','v','j','q','t','s','r','l','m','f'] + +# 무한입력. try except +while 1: + try: + S = input() + ans = "" + for i in range(len(S)): + if S[i].lower() in moem: + if S[i].isupper(): + k = S[i].lower() + for j in range(6): + if moem[j] == k: + a = moem[(j+3)%6] + ans += a.upper() + elif S[i].islower(): + for j in range(6): + if moem[j] == S[i]: + a = moem[(j+3)%6] + ans += a + elif S[i].lower() in zaem: + if S[i].isupper(): + k = S[i].lower() + for j in range(20): + if zaem[j] == k: + a = zaem[(j+10)%20] + ans += a.upper() + elif S[i].islower(): + for j in range(20): + if zaem[j] == S[i]: + a = zaem[(j+10)%20] + ans += a + else: + ans += S[i] + + print(ans) + except: + break \ No newline at end of file diff --git "a/4963\354\204\254\354\235\230\352\260\234\354\210\230_bfs.py" "b/4963\354\204\254\354\235\230\352\260\234\354\210\230_bfs.py" new file mode 100644 index 0000000..19512af --- /dev/null +++ "b/4963\354\204\254\354\235\230\352\260\234\354\210\230_bfs.py" @@ -0,0 +1,35 @@ +import sys +input = sys.stdin.readline +from collections import deque + +dx = [1, -1, 0, 0, 1, -1, 1, -1] +dy = [0, 0, -1, 1, -1, -1, 1, 1] + +# bfs이용 근처에 1인 육지들을 찾아다니며 전부 0으로 만들어버린다. +def bfs(i, j): + matrix[i][j] = 0 + queue = deque() + queue.append([i,j]) + while queue: + a, b = queue.popleft() + for k in range(8): + x = a + dx[k] + y = b + dy[k] + if 0 <= x < h and 0 <= y < w and matrix[x][y] == 1: + matrix[x][y] = 0 + queue.append([x, y]) + +# +while True: + w, h = map(int, input().split()) + if w == 0 and h == 0: + break + matrix = [list(map(int, input().split())) for _ in range(h)] + cnt = 0 + # 땅이면 팔방탐색하고 섬카운트 하나 늘려. + for i in range(h): + for j in range(w): + if matrix[i][j] == 1: + bfs(i, j) + cnt += 1 + print(cnt) \ No newline at end of file diff --git "a/4963\354\204\254\354\235\230\352\260\234\354\210\230_dfs.py" "b/4963\354\204\254\354\235\230\352\260\234\354\210\230_dfs.py" new file mode 100644 index 0000000..2a6bb8b --- /dev/null +++ "b/4963\354\204\254\354\235\230\352\260\234\354\210\230_dfs.py" @@ -0,0 +1,30 @@ +import sys +read = sys.stdin.readline +sys.setrecursionlimit(10000) + +def dfs(x, y): + dx = [1, 1, -1, -1, 1, -1, 0, 0] + dy = [0, 1, 0, 1, -1, -1, 1, -1] + + field[x][y] = 0 + for i in range(8): + nx = x + dx[i] + ny = y + dy[i] + if 0 <= nx < h and 0 <= ny < w and field[nx][ny] == 1: + dfs(nx, ny) + +while True: + w, h = map(int, read().split()) + if w == 0 and h == 0: + break + field = [] + count = 0 + for _ in range(h): + field.append(list(map(int, read().split()))) + for i in range(h): + for j in range(w): + if field[i][j] == 1: + dfs(i, j) + count += 1 + + print(count) \ No newline at end of file diff --git "a/6588\352\263\250\353\223\234\353\260\224\355\235\220.py" "b/6588\352\263\250\353\223\234\353\260\224\355\235\220.py" new file mode 100644 index 0000000..7fc9d36 --- /dev/null +++ "b/6588\352\263\250\353\223\234\353\260\224\355\235\220.py" @@ -0,0 +1,23 @@ +def isPrime(num): + if num==1: + return False + else: + for i in range(2, int(num**0.5)+1): + if num%i == 0: + return False + return True + + + +while 1: + N = int(input()) + if N==0: + break + else: + for i in range(1, N+1): + if isPrime(i): + A = N-i + if isPrime(A): + print(f'{N} = {i} + {A}') + break + \ No newline at end of file diff --git "a/6603\353\241\234\353\230\220.py" "b/6603\353\241\234\353\230\220.py" new file mode 100644 index 0000000..77c6052 --- /dev/null +++ "b/6603\353\241\234\353\230\220.py" @@ -0,0 +1,17 @@ +import sys +input = sys.stdin.readline +from itertools import combinations + + +while 1: + k_lists = list(map(int,input().split())) + k = k_lists[0] + + if k ==0: + break + + coms = combinations(k_lists[1:],6) + + for nums in coms: + print(*nums) + print("") \ No newline at end of file diff --git "a/6603\353\241\234\353\230\220_DFS.py" "b/6603\353\241\234\353\230\220_DFS.py" new file mode 100644 index 0000000..555b1ef --- /dev/null +++ "b/6603\353\241\234\353\230\220_DFS.py" @@ -0,0 +1,21 @@ +def dfs(start, depth): + if depth == 6: + for i in range(6): + print(combi[i], end=' ') + print() + return + # s[0]을 첫번째에 넣고 s[1]을 두번째에 넣고...dfs로 파고들면서 depth가 완성되면 하나 출력, 줄바꾸고 s[i]가 쭉쭉 밀리다가 depth 6을 더이상 + # 유지 하지 못할 순간이 오면 (dfs마다 start가 점점 늘어나기 때문에 남은 숫자가 6개 미만이 되면 답을 낼 수 없다.) 더이상 출력없이 dfs가 종료. + for i in range(start, len(s)): + combi[depth] = s[i] + dfs(i + 1, depth + 1) + +combi = [0 for _ in range(13)] + +while True: + s = list(map(int, input().split())) + if s[0] == 0: + break + del s[0] + dfs(0, 0) + print() \ No newline at end of file diff --git "a/7562\353\202\230\354\235\264\355\212\270\354\235\230\354\235\264\353\217\231.py" "b/7562\353\202\230\354\235\264\355\212\270\354\235\230\354\235\264\353\217\231.py" new file mode 100644 index 0000000..294cc88 --- /dev/null +++ "b/7562\353\202\230\354\235\264\355\212\270\354\235\230\354\235\264\353\217\231.py" @@ -0,0 +1,33 @@ +import sys +input = sys.stdin.readline +from collections import deque + +T = int(input()) + +dx = [1,2,1,2,-1,-2,-1,-2] +dy = [-2,-1,2,1,2,1,-2,-1] +queue = deque() + +def BFS(x,y): + queue.append([x,y]) + while queue: + x,y = queue.popleft() + for i in range(8): + nx = x+dx[i] + ny = y+dy[i] + if 0<=nx m: + continue + + clock[nextHere][cost + nextCost] = min(clock[nextHere][cost + nextCost], distance + nextTime) + + return clock + +def main(): + t = int(input()) + + for _ in range(t): + n, m, k = map(int, input().split()) + + airport = [[] for _ in range(n+1)] + clock = [[INF for _ in range(m+1)] for _ in range(n+1)] + for _ in range(k): + src, dst, cost, time = map(int, sys.stdin.readline().split()) + airport[src].append((dst, cost, time)) + + clock = dijkstra(airport, clock, n, m) + if min(clock[n]) == INF: + print("Poor KCM") + else: + print(min(clock[n])) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git "a/LC169_\352\263\274\353\260\230\354\210\230.py" "b/LC169_\352\263\274\353\260\230\354\210\230.py" new file mode 100644 index 0000000..f58e44f --- /dev/null +++ "b/LC169_\352\263\274\353\260\230\354\210\230.py" @@ -0,0 +1,13 @@ +class Solution: + def majorityElement(self, nums) -> int: + if not nums: + return None + if len(nums) == 1: + return nums[0] + + half = len(nums)//2 + a = self.majorityElement(nums[:half]) + b = self.majorityElement(nums[half:]) + return [b,a][nums.count(a)>half] + +# self를 붙히는 이유는 매개변수인 nums에 대한 재귀이기 때문에? diff --git "a/LC241\354\210\253\354\236\220\354\227\260\354\202\260\354\236\220\354\241\260\355\225\251.py" "b/LC241\354\210\253\354\236\220\354\227\260\354\202\260\354\236\220\354\241\260\355\225\251.py" new file mode 100644 index 0000000..097a0a0 --- /dev/null +++ "b/LC241\354\210\253\354\236\220\354\227\260\354\202\260\354\236\220\354\241\260\355\225\251.py" @@ -0,0 +1,32 @@ +class Solution: + def diffWaysToCompute(self, input: str): + def operation(le, ri, oper): + sm = 0 + result = [] + for l in le: + for r in ri: + if oper == "+": + sm = l + r + elif oper == "-": + sm = l - r + elif oper == "*": + sm = l * r + result.append(sm) + return result + results = [] + + # 연산자없이 오직 숫자만을 가질 때 리스트 형태로 바로 반환. + if input.isdigit(): + return [int(input)] + + # 연산이 수행되는 순서에 따라 값이 달라지므로 모든 경우를 구하기 위해 반복이 필요하다. + for i in range(len(input)): + if input[i] in '+-*': + # 현재 연산자 기준으로 분할 + left = self.diffWaysToCompute(input[:i]) + right= self.diffWaysToCompute(input[i + 1:]) + + # 양쪽 결과를 병합해서 나온 값들을 넣어줌 + # 여러 값이 리스트로 나오는 것은 순서마다 나올 수 있는 값이 다르기 때문! + results.extend(operation(left, right, input[i])) + return results \ No newline at end of file diff --git a/README.md.txt b/README.md.txt new file mode 100644 index 0000000..c0373b9 --- /dev/null +++ b/README.md.txt @@ -0,0 +1,15 @@ +1일 1 알고리즘! 생각을 구현하자! + +문제 읽고 이해하기 +문제를 익숙한 용어로 재정의하기 +어떻게 해결할지 계획 세우기 4.계획 검증하기 +프로그램으로 구현하기 +풀이를 돌아보고 개선할 방법 찾기. +-직관적이고 체계적인 접근 + +비슷한 문제를 풀어본 적 있는가? +단순한 방법에서 시작할 수 있는가? +문제를 단순화 할 수 있는가? 그림그릴수있나? 수식으로 표현할 수 있나? +문제를 분해 할 수 있을까? +뒤에서부터 생각해서 문제를 풀수있는가? +특정형태의 답만을 고려할 수 있을까? \ No newline at end of file diff --git a/__pycache__/lotto_numbering_module.cpython-38.pyc b/__pycache__/lotto_numbering_module.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18826a9bc2068dd6fe8ce52da15c6c8c168b8bb4 GIT binary patch literal 1426 zcmb_c%}>-o6rY)X(DLP~C`3JQ(b$7T6EKDlLX@N7AR!`IgDX=J*=^V9>;c?8n8gGk zCThT}1PBBzXG;3FolO(rCf6fTGB z3gjX25|rS>wE}rWJT?fr4w5Hpl!3ON3<5fOpFoGXZh&xgF)Y1r4ZluTN;}a~sWqBi zjFvy_E5h~N)@b=nxUycEFGW*3(ZbyI^3G2ir{cJKjA)otRYi0g(G_##d`%?PD zUM}<06=UA$aK`7kwA+@QP<65Q;n;N@xD4t62-T@c6CjODp!Vdf-2v;Nj6uGRWQ?7X zF|99$SwEJn@b%KaWU9Tx>D;>k4uk=)L6zouJkCxPu=A8%4G=6%ungjE{1e<6(48FI ze`|?$xMn}f^42!?LwR#Cnl7E%2)CgTfHKwSu>K={&XY&u+b>{jyMhrOE8tm-Q3Lor zkOwGn+n3-)0^cOdlRV|L8Awpn@@$nAGzt6z4(jh1B~p`m9{6{#Hmd6)?In-9ldPZ@ zjJz(*cn@tM<4mOCys=V~H&zc$z3e$bXCkkq#VK;Sr~%c0R*u~lQz3T=KC<%ZZM5(W zbN5%jgfnxBhz8g&slB>c$YFtzTeH*Q?3Xry*@&~~*vb?skNX*A2B}Oo?J5J-qcCNG z6B4w(kS 10: # 부분집합의 합을 구하는 문제에서 구하고자하는 값인 10을 넘는다면 더이상 계산할 필요가 없으므로 return해버린다.(가지치기) + return + if n == k: + printSet(k, sum) + else: + A[k] = 1 + powerset(k+1, n, sum+data[k]) + A[k] = 0 + powerset(k+1, n, sum) + + # 백트래킹은 완전검색에서 가지치기를함 \ No newline at end of file diff --git a/beakjoon1006_dp.py b/beakjoon1006_dp.py new file mode 100644 index 0000000..76e9c29 --- /dev/null +++ b/beakjoon1006_dp.py @@ -0,0 +1,16 @@ +import sys, collections +T = int(sys.stdin.readline()) + +for test in range(T): + + N,M,K= map(int,sys.stdin.readline().split()) + + air = collections.defaultdict(list) + c = [0]*N + t = [0]*N + + for _ in range(K): + u,v,c,d = map(int,sys.stdin.readline().split()) + air[u].append(v) + + print(air[1]) \ No newline at end of file diff --git a/beakjoon1463.py b/beakjoon1463.py new file mode 100644 index 0000000..967ea72 --- /dev/null +++ b/beakjoon1463.py @@ -0,0 +1,22 @@ +import sys + +N=int(sys.stdin.readline()) +cnt=0 +bag=[3,5] + +while N != 0: + if N%3==0: + cnt += N//3 + N=0 + elif N%2==0: + cnt += N//2 + N=0 + elif N < 0: + print(-1) + break + else: + N = N-1 + cnt += 1 + +if N==0: + print(cnt) \ No newline at end of file diff --git a/beakjoon1463_dp.py b/beakjoon1463_dp.py new file mode 100644 index 0000000..b268912 --- /dev/null +++ b/beakjoon1463_dp.py @@ -0,0 +1,18 @@ +import sys + +T = int(sys.stdin.readline()) +dp = [0 for _ in range(11)] +for i in range(4,11): + dp[1] = 1 + dp[2] = 2 + dp[3] = 4 + dp[i] = dp[i-1] + dp[i-2] + dp[i-3] +for test in range(T): + N = int(sys.stdin.readline()) + + print(dp[N]) + + + + + diff --git a/beakjoon2839.py b/beakjoon2839.py new file mode 100644 index 0000000..967ea72 --- /dev/null +++ b/beakjoon2839.py @@ -0,0 +1,22 @@ +import sys + +N=int(sys.stdin.readline()) +cnt=0 +bag=[3,5] + +while N != 0: + if N%3==0: + cnt += N//3 + N=0 + elif N%2==0: + cnt += N//2 + N=0 + elif N < 0: + print(-1) + break + else: + N = N-1 + cnt += 1 + +if N==0: + print(cnt) \ No newline at end of file diff --git a/beakjoon9095_dp.py b/beakjoon9095_dp.py new file mode 100644 index 0000000..35396f6 --- /dev/null +++ b/beakjoon9095_dp.py @@ -0,0 +1,32 @@ +import sys + +T = int(sys.stdin.readline()) + +N,W = map(int,sys.stdin.readline().split()) + +circle = [list(map(int,sys.stdin.readline().split()))for _ in range(2)] + +check = [[0]*8 for _ in range(2)] +cnt = 0 + +for j in range(2): + for i in range(8): + if check[i][j] ==0: + if circle[i][j] < W: + if circle[i][j]+circle[(i-1)%8][j] <=100 and check[(i-1)%8][j] ==0: + check[i][j], check[(i-1)%8][j] = 1,1 + cnt +=1 + elif circle[i][j]+circle[(i+1)%8][j] <=100 and check[(i+1)%8][j] ==0: + check[i][j], check[(i+1)%8][j] = 1,1 + cnt +=1 + elif circle[i][j]+circle[i][(j-1)%2] <=100 and check[i][(j-1)%2] ==0: + check[i][j], check[i][(j-1)%2] = 1,1 + cnt +=1 + elif circle[i][j]+circle[i][(j+1)%2] <=100 and check[i][(j+1)%2] ==0: + check[i][j], check[i][(j+1)%2] = 1,1 + cnt +=1 + else: + check[i][j]=1 + cnt +=1 + +print(cnt) \ No newline at end of file diff --git a/bfs.py b/bfs.py new file mode 100644 index 0000000..db8d535 --- /dev/null +++ b/bfs.py @@ -0,0 +1,74 @@ +# 순열 + +def permute(arr): + result = [arr[:]] + c = [0] * len(arr) + i = 0 + while i < len(arr): + if c[i] < i: + if i % 2 == 0: + arr[0], arr[i] = arr[i], arr[0] + else: + arr[c[i]], arr[i] = arr[i], arr[c[i]] + + result.append(arr[:]) + c[i] += 1 + i = 0 + else: + c[i] = 0 + i += 1 + return result + +# 재귀순열 +def perm(lis, n): + result = [] + if n > len(lis): + return result + if n == 1: + for li in lis: + result.append([li]) + elif n > 1: + for i in range(len(lis)): + tmp = [i for i in lis] + tmp.remove(lis[i]) + for j in perm(tmp, n-1): + result.append([lis[i]]+j) + return result + +n = int(input()) +lis = list(i for i in range(1, n+1)) +for li in perm(lis,n): + print(' '.join(list(map(str, li)))) + +# 리스트 그래프 +s = [[0]*6 for i in range(6)] s[1][2] = 1 s[2][1] = 1 s[1][3] = 1 s[3][1] = 1 s[2][4] = 1 s[4][2] = 1 s[2][5] = 1 s[5][2] = 1 + +# dic그래프 +adj_list = {1: set([2,3]), 2: set([1,4,5]), 3: set([1]), 4: set([2]), 5: set([2])} + +# bfs + +def bfs(graph, start): + visited = [] + queue = [start] + while queue: + n = queue.pop(0) + if n not in visited: + visited.append(n) + queue += graph[n] - set(visited) + return visited + +# deque bfs + +from collections import deque + +def bfs_dequeue(graph, start): + visited = [] + queue = deque([start]) + + while queue: + n = queue.popleft() + if n not in visited: + visited.append(n) + queue += graph[n] - set(visited) + return visited diff --git a/bitsolved.py b/bitsolved.py new file mode 100644 index 0000000..5faa57e --- /dev/null +++ b/bitsolved.py @@ -0,0 +1,31 @@ +def d(c): + if ord('0') <= ord(c) <= ord('9'): + return ord(c)-ord('0') + return ord(c)-ord('A')+10 +def to36(n): + if n == 0: + return "0" + S = "" + d = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] + while n > 0: + S += d[n%36] + n = n // 36 + return S[::-1] +N = int(input()) +val = [0]*36 +for _ in range(N): + S = input() + for i in range(len(S)): + val[d(S[i])] += 36**(len(S)-i-1) +K = int(input()) +arr = [[0]*2 for i in range(36)] +for i in range(36): + arr[i][0] = val[i]*(35-i) + arr[i][1] = i +arr.sort() +ans = 0 +for i in range(36-K): + ans += val[arr[i][1]]*arr[i][1] +for i in range(36-K, 36): + ans += val[arr[i][1]]*35 +print(to36(ans)) \ No newline at end of file diff --git a/calkin_wilf_tree1.py b/calkin_wilf_tree1.py new file mode 100644 index 0000000..3f4119d --- /dev/null +++ b/calkin_wilf_tree1.py @@ -0,0 +1,25 @@ +T = int(input()) + + + +for test_case in range(1, T + 1): + P = list(input()) + Q = list(input()) + + for i in range(len(P)): + if len(Q) == len(P)+1 and Q[-1] == "a": + if P[i] == Q[i]: + answer = 1 + continue + else: + answer = 0 + else: + answer = 0 + break + if answer == 1: + print("#{} N".format(test_case)) + else: + print("#{} Y".format(test_case)) + + + \ No newline at end of file diff --git a/color_fulling.py b/color_fulling.py new file mode 100644 index 0000000..d6173e5 --- /dev/null +++ b/color_fulling.py @@ -0,0 +1,22 @@ +""" +N킬로그램 배달해야됨. +봉지는 3,5킬로 단위. +가장 적은 봉지 +""" + +N = int(input()) + +cnt =0 + +while N>0: + if N%5==0: + cnt += N//5 + break + else: + N = N-3 + cnt +=1 + +if N<0: + print(-1) + +print(cnt) \ No newline at end of file diff --git a/color_mine.py b/color_mine.py new file mode 100644 index 0000000..f56710a --- /dev/null +++ b/color_mine.py @@ -0,0 +1,22 @@ +T = int(input()) + + +def coloringGraph(): + N,E,M = map(int,input().split()) + + G =[[0 for _ in range(N)]for _ in range(N)] + + for _ in range(E): + x,y = map(int,input().split()) + G[x-1][y-1] = 1 + G[y-1][x-1] = 1 + + for i in range(N): + if sum(G[i]) > M: + return 0 + + return 1 + + +for testcase in range(T): + print("#{} {}".format(testcase+1, coloringGraph())) diff --git a/common_list_number.py b/common_list_number.py new file mode 100644 index 0000000..aa0cb88 --- /dev/null +++ b/common_list_number.py @@ -0,0 +1,22 @@ +#coding: utf-8 + +#학생별, 과목별 총점 및 평균 구하기 + +scores = [] + +count = int(input("총 학생의 수를 입력하세요:")) + +for i in range(1, count+1): + score = {} + score["name"] = input("학생의 이름을 입력하세요:") + score["kor"] = int(input("{0} 학생의 국어 점수플 입력하세요:".format(score["name"]))) + score["mat"] = int(input("{0} 학생의 수학 점수플 입력하세요:".format(score["name"]))) + score["eng"] = int(input("{0} 학생의 수학 점수플 입력하세요:".format(score["name"]))) + scores.append(score) + +for score in scores: + total = 0 + for key in score: + if key != "name": + total += score[key] + print("{0}학생 => 총점:{1}, 평균 : {2:0.2F}".format(score["name"],total,total/3)) \ No newline at end of file diff --git a/double_linkedList.py b/double_linkedList.py new file mode 100644 index 0000000..ea8db2c --- /dev/null +++ b/double_linkedList.py @@ -0,0 +1,13 @@ +class HashTable: + def __init__(self): + self.hash_table = list([0 for i in range(8)]) + def hash_function(self, key): + return key % 8 + def insert(self, key, value): + hash_value = self.hash_function(hash(key)) + self.hash_table[hash_value] = value + def read(self, key): + hash_value = self.hash_function(hash(key)) + return self.hash_table[hash_value] + def print(self): print(self.hash_table) + diff --git a/find_str_replace_practice.py b/find_str_replace_practice.py new file mode 100644 index 0000000..a43696d --- /dev/null +++ b/find_str_replace_practice.py @@ -0,0 +1,19 @@ +#coding: utf-8 + +#문자열 찾기 및 조작 + +data_str = "파이썬은 클래스를 이용해 객체를 생성하는 객체지향 프로그래밍 언어입니다." +mask_str = input("마스킹할 문자열을 입력하세요:") +find_str = input("찾을 문자열을 입력하세요:") +idx = -1 +count = 1 +while True: + idx = data_str.find(find_str,idx+1) + if idx != -1: + print("[{0}]~[{1}]".format(idx,idx+len(find_str)-1)) + new_str = data_str.replace(find_str,mask_str,count) + print(new_str) + count += 1 + else: + break +print(idx) \ No newline at end of file diff --git a/hashtable2..py b/hashtable2..py new file mode 100644 index 0000000..1e4a58b --- /dev/null +++ b/hashtable2..py @@ -0,0 +1,24 @@ +# 순열 + +def permute(arr): + result = [arr[:]] + c = [0] * len(arr) + i = 0 + while i < len(arr): + if c[i] < i: + if i % 2 == 0: + arr[0], arr[i] = arr[i], arr[0] + else: + arr[c[i]], arr[i] = arr[i], arr[c[i]] + + result.append(arr[:]) + c[i] += 1 + i = 0 + else: + c[i] = 0 + i += 1 + return result + + +def perm(lis, n): result = [] if n > len(lis): return result if n == 1: for li in lis: result.append([li]) elif n > 1: for i in range(len(lis)): tmp = [i for i in lis] tmp.remove(lis[i]) for j in perm(tmp, n-1): result.append([lis[i]]+j) return result n = int(input()) lis = list(i for i in range(1, n+1)) for li in perm(lis,n): print(' '.join(list(map(str, li)))) + diff --git a/infinity_dic.py b/infinity_dic.py new file mode 100644 index 0000000..3f4119d --- /dev/null +++ b/infinity_dic.py @@ -0,0 +1,25 @@ +T = int(input()) + + + +for test_case in range(1, T + 1): + P = list(input()) + Q = list(input()) + + for i in range(len(P)): + if len(Q) == len(P)+1 and Q[-1] == "a": + if P[i] == Q[i]: + answer = 1 + continue + else: + answer = 0 + else: + answer = 0 + break + if answer == 1: + print("#{} N".format(test_case)) + else: + print("#{} Y".format(test_case)) + + + \ No newline at end of file diff --git a/infinity_dic_pass.py b/infinity_dic_pass.py new file mode 100644 index 0000000..31c6eff --- /dev/null +++ b/infinity_dic_pass.py @@ -0,0 +1,22 @@ +N = int(input()) + + +for i in range(1,N+1): + cnt = 0 + number = i + if i>100: + if i//100 ==3 or i//100 ==6 or i//100 ==9: + cnt +=1 + i = i - i//100 *100 + if i>10: + if i//10 ==3 or i//10 ==6 or i//10 ==9: + cnt +=1 + i = i - i//10 *10 + if i == 3 or i ==6 or i ==9: + cnt +=1 + if cnt !=0: + for _ in range(cnt): + print("-", end ="") + print(end = " ") + else: + print(number, end=" ") \ No newline at end of file diff --git a/length_make_mountain.py b/length_make_mountain.py new file mode 100644 index 0000000..e305550 --- /dev/null +++ b/length_make_mountain.py @@ -0,0 +1,18 @@ +#coding: utf-8 + + +T = int(input()) + +def LISDP(): + a = list(map(int,input().split())) + LIS = [0]*(a[0]+1) + for i in range(1,a[0]+1): + LIS[i] = 1 + for j in range(1,i): + if a[j] LIS[i]: + LIS[i] = 1+LIS[j] + return max(LIS) + + +for k in range(T): + print("#{0} {1}".format(k+1, LISDP())) \ No newline at end of file diff --git a/list_practice.py b/list_practice.py new file mode 100644 index 0000000..c090d9f --- /dev/null +++ b/list_practice.py @@ -0,0 +1,10 @@ +#coding: utf-8 + + +arr =list(map(int,input().split()) + +for i in range(1< LIS[i]: + LIS[i] = 1+LIS[j] + return max(LIS) + + +for k in range(T): + print("#{0} {1}".format(k+1, LISDP())) \ No newline at end of file diff --git a/map,filter,lambda,eval_practice.py b/map,filter,lambda,eval_practice.py new file mode 100644 index 0000000..be751d9 --- /dev/null +++ b/map,filter,lambda,eval_practice.py @@ -0,0 +1,50 @@ +#coding: utf-8 + +#Lotto.py + +import random + +lotto = random.sample(range(1,46,1),6) + +print(sorted(lotto)) + +def input_start(): + start = 0 + try: + start = int(input("로또 번호의 시작 번호를 입력하세요(기본값1):")) + except: + start = 1 + finally: + return start + +def input_end(): + try: + end = int(input("로또 번호의 끝 번호를 입력하세요(기본값45):")) + except: + end = 45 + finally: + return end + +def input_count(): + count = 0 + try: + count = int(input("로또 공의 개수를 입력하세요(기본값6):")) + except: + count = 6 + finally: + return count + +def print_lotto(start, end, count): + lotto = random.sample(range(start,end+1,1), count) + print("행운의 로또 번호는", end="") + print(sorted(lotto), end = "") + #리스트 기호[]삭제 + for i, num in enumerate(sorted(lotto)): + if i == len(lotto) -1:#마지막일시 + print("{0}".format(num),end="") + else:#마지막이 아닐시 + print("{0}".format(num),end="") + + print("입니다.") + + print_lotto(1,45,6) \ No newline at end of file diff --git a/mapping.py b/mapping.py new file mode 100644 index 0000000..2f85570 --- /dev/null +++ b/mapping.py @@ -0,0 +1,38 @@ +from collections import deque +import sys +def bfs(q, cnt = 0): + dx, dy = [0, 0, 1, -1], [1, -1, 0, 0] + while q: + cnt += 1 + for _ in range(len(q)): + x, y = q.popleft() + for i in range(4): + nx, ny = x + dx[i], y + dy[i] + if nx >= N or nx < 0 or ny >= M or ny < 0 or arr[nx][ny] != 0: + continue + arr[nx][ny] = 1 + q.append((nx,ny)) + if check(arr): + return cnt - 1 + else: + return -1 + +def check(arr): + for i in range(N): + for j in range(M): + if arr[i][j] == 0: + return False + break + return 1 + +if __name__ == "__main__": + input = sys.stdin.readline + M, N = map(int,input().split()) + q = deque([]) + arr = [] + for i in range(N): + arr.append(list(map(int,input().split()))) + for j in range(M): + if arr[i][j] == 1: + q.append((i,j)) + print(bfs(q)) \ No newline at end of file diff --git a/max_min practce.py b/max_min practce.py new file mode 100644 index 0000000..8204712 --- /dev/null +++ b/max_min practce.py @@ -0,0 +1,9 @@ +#coding: utf-8 + +arr = list(map(int,input().split()) + +for i in range(1<=minft: + cnt += 1 + minft = j + +print(cnt) diff --git a/nQueen.py b/nQueen.py new file mode 100644 index 0000000..64e86eb --- /dev/null +++ b/nQueen.py @@ -0,0 +1,16 @@ +T = int(input()) + + + +for test_case in range(1, T + 1): + edge = list(input()) + Numerator = 1 + Demorator = 1 + + for i in range(len(edge)): + if edge[i] == "L": + Demorator += Numerator + else: + Numerator += Demorator + + print("#{} {} {}".format(test_case, Numerator, Demorator)) \ No newline at end of file diff --git a/object_oriented_practice.py b/object_oriented_practice.py new file mode 100644 index 0000000..d0dea41 --- /dev/null +++ b/object_oriented_practice.py @@ -0,0 +1,24 @@ +#coding: utf-8 + +def get_max(init_num): + my_max = init_num[0] + for i in range(1, len(init_num)): + if my_max < init_num[i]: + my_max = init_num[i] + + return my_max + +def get_min(init_num): + my_min = init_num[0] + for i in range(1,len(init_num)): + if my_min > init_num[i]: + my_min = init_num[i] + + return my_min + +TC = int(input()) +for tc in range(1, TC+1): + N = int(input()) + init_num = list(map(int, input().split())) + result = get_max(init_num) - get_min(init_num) + print(f'#{tc} {result}') \ No newline at end of file diff --git a/paskal_triangle.py b/paskal_triangle.py new file mode 100644 index 0000000..87f5833 --- /dev/null +++ b/paskal_triangle.py @@ -0,0 +1,15 @@ +import itertools as it + +T = int(input()) +for test in range(T): + N = int(input()) + s = [] + print("#{}\n1".format(test+1)) + for i in range(N-1): + s.append(i) + + for j in range(i+2): + com = list(it.combinations(s,j)) + num = len(com) + print(num, end = " ") + print("") \ No newline at end of file diff --git a/patternMatching.py b/patternMatching.py new file mode 100644 index 0000000..3c805b0 --- /dev/null +++ b/patternMatching.py @@ -0,0 +1,70 @@ +# 본 코드는 text안에 찾는 pattern 이 있으면 1 없으면 0 을 출력해주는 코드이다 + +# 보이어무어 알고리즘을 적용했다. + + + +# 보이어무어 알고리즘이란 다음과 같다 + +# pattern의 오른쪽 끝 문자와 text의 현재 위치의 문자가 일치하는지 검사 +# 끝이 일치하면 pattern과 text를 다 검사한다. 마지막까지 일치하지 않으면 패턴길이만큼 skip +# 끝이 일치하지않으면 text의 현재위치 문자가 skip배열에 있는지 확인. 있으면 인덱스만큼 skip, 없으면 패턴길이만큼 skip +# 텍스트 끝 도달할 때까지 반복 + +text = 'a pattern matching algorithm' +pattern = 'rithm' +s = pattern[::-1] +skip = list(range((len(pattern)))) + +i = len(pattern)-1 +result = 0 + +while i < len(text): + nxt = len(s) + j = 0 + if s[j] == text[i]: + while j < len(s): + if s[j] != text[i-j]: + break + j += 1 + if j == len(s): + result = 1 + else: + while j < len(s): + if s[j] == text[i]: + nxt = min(j, nxt) + break + j += 1 + if result: + break + i += nxt + +print(result) + + +# 고지식한 패턴검색 알고리즘 = Brute Force. 텍스트의 모든 위치에서 패턴비교 O(MN) + +# KMP 알고리즘. 불일치 발생한 앞부분 대해 다시 비교하지 않고 매칭 수행 O(M+N)=O(N) +# next 배열을 생성해 불일치 발생하면 이동할 다음위치 저장. +# 패턴 왼쪽에서 오른쪽으로 비교 + +# 보이어 무어 알고리즘. 앞부분보다 끝부분가서 불일치 일어날 확률이 높다는 것 이용 +# 일반적으로는 O(N) 보다 적은 수행시간. 최악일땐 O(MN) +# skip 배열 생성해서 일치하는 칸으로 몇칸 이동해야하는지 저장 +# 패턴 오른쪽에서 왼쪽으로 비교. + +# 그러면 3가지 패턴매칭 알고리즘을 비교해보자. M은 패턴의 길이, N은 텍스트의 길이 +# Brute Force(=고지식한 패턴검색 알고리즘) +# 텍스트의 모든 위치에서 패턴 비교하고 한칸씩 이동한다. +# 시간복잡도 O(MN) +# KMP +# 불일치 발생한 앞부분에 대해 다시 비교하지 않고 매칭 수행 +# next배열을 생성해 불일치 발생하면 이동할 다음 위치 저장 +# 패턴의 왼쪽에서 오른쪽으로 비교 +# 시간복잡도 O(M+N) = O(N) +# 보이어무어 +# 앞부분보다 끝부분가서 불일치 일어날 확률이 높다는 것 이용 +# skip 배열 생성해서 일치하는 칸으로 몇 칸 이동해야하는지 저장 +# 패턴의 오른쪽에서 왼쪽으로 비교 +# 상용화된 제품이나 서비스에 가장 많이 적용됨 +# 시간복잡도 일반적으로 O(N) 이하. 최학일땐 O(MN) \ No newline at end of file diff --git a/quickSoreted.py b/quickSoreted.py new file mode 100644 index 0000000..9b39ce3 --- /dev/null +++ b/quickSoreted.py @@ -0,0 +1,42 @@ +# 퀵정렬 + + +def quick_sort(arr): + if len(arr) <= 1: + return arr + pivot = arr[len(arr) // 2] + lesser_arr, equal_arr, greater_arr = [], [], [] + for num in arr: + if num < pivot: + lesser_arr.append(num) + elif num > pivot: + greater_arr.append(num) + else: + equal_arr.append(num) + return quick_sort(lesser_arr) + equal_arr + quick_sort(greater_arr) + + + +# 큇정렬 최적화(inplace)\ +def quick_sort(arr): + def sort(low, high): + if high <= low: + return + + mid = partition(low, high) + sort(low, mid - 1) + sort(mid, high) + + def partition(low, high): + pivot = arr[(low + high) // 2] + while low <= high: + while arr[low] < pivot: + low += 1 + while arr[high] > pivot: + high -= 1 + if low <= high: + arr[low], arr[high] = arr[high], arr[low] + low, high = low + 1, high - 1 + return low + + return sort(0, len(arr) - 1) \ No newline at end of file diff --git a/score set_practice.py b/score set_practice.py new file mode 100644 index 0000000..a43696d --- /dev/null +++ b/score set_practice.py @@ -0,0 +1,19 @@ +#coding: utf-8 + +#문자열 찾기 및 조작 + +data_str = "파이썬은 클래스를 이용해 객체를 생성하는 객체지향 프로그래밍 언어입니다." +mask_str = input("마스킹할 문자열을 입력하세요:") +find_str = input("찾을 문자열을 입력하세요:") +idx = -1 +count = 1 +while True: + idx = data_str.find(find_str,idx+1) + if idx != -1: + print("[{0}]~[{1}]".format(idx,idx+len(find_str)-1)) + new_str = data_str.replace(find_str,mask_str,count) + print(new_str) + count += 1 + else: + break +print(idx) \ No newline at end of file diff --git a/score_aver,total_practice.py b/score_aver,total_practice.py new file mode 100644 index 0000000..f67b38b --- /dev/null +++ b/score_aver,total_practice.py @@ -0,0 +1,12 @@ +#coding: utf-8 + +#성적 총점 평점. +list1 = [1,3, 6, 78, 35, 55] +list2 = [12,24,35,24,88,120,155] + +#교집합 찾기.= 합집합- 반달1-반달2 +#1:1대응 +def intersect(x,y): + return(set(x)&set(y)) + +print("두 배열의 공통된부분은?:{0}".format(intersect(list1,list2))) \ No newline at end of file diff --git a/snail_number.py b/snail_number.py new file mode 100644 index 0000000..0903290 --- /dev/null +++ b/snail_number.py @@ -0,0 +1,22 @@ +T = int(input()) + + +def coloringGraph(): + N,E,M = map(int,input().split()) + + G =[[0 for _ in range(N)]for _ in range(N)] + + for _ in range(E): + x,y = map(int,input().split()) + G[x-1][y-1] = 1 + G[y-1][x-1] = 1 + + for i in range(N): + if sum(G[i]) > M: + return 0 + + return 1 + + +for testcase in range(T): + print("#{} {}".format(testcase+1, coloringGraph())) \ No newline at end of file diff --git a/sugar_delievery2839.py b/sugar_delievery2839.py new file mode 100644 index 0000000..f0ee4be --- /dev/null +++ b/sugar_delievery2839.py @@ -0,0 +1,13 @@ +""" +N명의 사람들 줄서있음. +i번 사람이 인출하는데 Pi분 걸림. +""" +N = int(input()) +P = list(map(int,input().split())) + +mintime = sorted(P) +answer = 0 +for i in range(N): + answer += (N-i)*mintime[i] + +print(answer) \ No newline at end of file diff --git "a/tree\354\240\225\353\246\254.py" "b/tree\354\240\225\353\246\254.py" new file mode 100644 index 0000000..cfbc34b --- /dev/null +++ "b/tree\354\240\225\353\246\254.py" @@ -0,0 +1,275 @@ +# 이진트리 +class Node: + def __init__(self, data): + self.data = data + self.left = None + self.right = None + + def __str__(self): + return str(self.data) + +class Tree: + def __init__(self): + self.root = None + + def preorderTraversal(self, node): + print(node, end='') + if not node.left == None : self.preorderTraversal(node.left) + if not node.right == None : self.preorderTraversal(node.right) + + def inorderTraversal(self, node): + if not node.left == None : self.inorderTraversal(node.left) + print(node, end='') + if not node.right == None : self.inorderTraversal(node.right) + + def postorderTraversal(self, node): + if not node.left == None : self.postorderTraversal(node.left) + if not node.right == None : self.postorderTraversal(node.right) + print(node, end='') + + def makeRoot(self, node, left_node, right_node): + if self.root == None: + self.root = node + node.left = left_node + node.right = right_node + +if __name__ == "__main__": + node = [] + node.append(Node('-')) + node.append(Node('*')) + node.append(Node('/')) + node.append(Node('A')) + node.append(Node('B')) + node.append(Node('C')) + node.append(Node('D')) + + m_tree = Tree() + for i in range(int(len(node)/2)): + m_tree.makeRoot(node[i],node[i*2+1],node[i*2+2]) + + print( '전위 순회 : ', end='') ; m_tree.preorderTraversal(m_tree.root) + print('\n' + '중위 순회 : ', end='') ; m_tree.inorderTraversal(m_tree.root) + print('\n' + '후위 순회 : ', end='') ; m_tree.postorderTraversal(m_tree.root) + + + + # 스레드 이진트리 + class Node: + def __init__(self, data): + self.data = data + self.left = None + self.right = None + self.is_thread_right = None + + def __str__(self): + return str(self.data) + +class ThreadTree: + def __init__(self): + self.root = None + + def inorderTraversal(self, node): + while not node.left == None: + node = node.left + print(node, end='') + while True: + node = self.findThread(node) + print(node, end='') + if node.right == None: + break + + def findThread(self, node): + pre_node = node + node = node.right + if node == None: + return node + if pre_node.is_thread_right: + return node + while not node.left == None: + node = node.left + return node + + def makeRoot(self, node, left_node, right_node, thread): + if self.root == None: + self.root = node + node.left = left_node + node.right = right_node + node.is_thread_right = thread + +if __name__ == "__main__": + node = [] + node.append(Node('-')) + node.append(Node('*')) + node.append(Node('/')) + node.append(Node('A')) + node.append(Node('B')) + node.append(Node('C')) + node.append(Node('D')) + + m_tree = ThreadTree() + for i in range(int(len(node)/2)): + m_tree.makeRoot(node[i],node[i*2+1],node[i*2+2], False) + + m_tree.makeRoot(node[3], None, None, True) + m_tree.makeRoot(node[4], None, None, True) + m_tree.makeRoot(node[5], None, None, True) + + node[3].right = node[1] + node[4].right = node[0] + node[5].right = node[2] + + print('중위 순회 : ', end='') ; m_tree.inorderTraversal(m_tree.root) + + # 이진탐색트리 + import random + +class Node: + def __init__(self, data): + self.data = data + self.right = None + self.left = None + + def __str__(self): + return str(self.data) + +class SearchTree: + def __init__(self): + self.root = None + + def insertElement(self, data): + new_node = Node(data) + if self.root == None: + self.root = new_node + + node = self.root + while True: + pre_node = node + if node.data > new_node.data: + node = node.left + if node == None: + node = new_node + pre_node.left = node + elif node.data < new_node.data: + node = node.right + if node == None: + node = new_node + pre_node.right = node + else: return + + def searchElement(self, data): + node = self.root + while True: + if node.data > data: + node = node.left + elif node.data < data: + node = node.right + elif node.data == data: + break + else: + return Node('탐색 결과 없음') + + return node + + def preorderTraversal(self, node): + print(node, end=' ') + if not node.left == None : self.preorderTraversal(node.left) + if not node.right == None : self.preorderTraversal(node.right) + + def inorderTraversal(self, node): + if not node.left == None : self.inorderTraversal(node.left) + print(node, end=' ') + if not node.right == None : self.inorderTraversal(node.right) + + def postorderTraversal(self, node): + if not node.left == None : self.postorderTraversal(node.left) + if not node.right == None : self.postorderTraversal(node.right) + print(node, end=' ') + +if __name__ == "__main__": + m_tree = SearchTree() + + m_tree.insertElement(250) + for i in range(20): + m_tree.insertElement(random.randint(0,500)) + + print( '전위 순회 : ', end='') ; m_tree.preorderTraversal(m_tree.root) + print('\n' + '중위 순회 : ', end='') ; m_tree.inorderTraversal(m_tree.root) + print('\n' + '후위 순회 : ', end='') ; m_tree.postorderTraversal(m_tree.root) + + node = m_tree.searchElement(250) + print('\n' + '탐색한 노드의 값 :', node) + print( '노드의 왼쪽 서브 트리 :', node.left) + print( '노드의 오른쪽 서브 트리 :', node.right) + + node = m_tree.searchElement(node.left.data) + print('\n' + '탐색한 노드의 값 :', node) + print( '노드의 왼쪽 서브 트리 :', node.left) + print( '노드의 오른쪽 서브 트리 :', node.right) + + + # 힙구조 + class Heap: + def __init__(self): + self.array = [] + + def __str__(self): + return str(self.array) + + def insertElement(self, data): + self.array.append(data) + length = len(self.array) + if length > 1: + node_num = length - 1 + while True: + next_node_num = int(node_num/2) + if self.array[next_node_num] < self.array[node_num]: + temp = self.array[node_num] + self.array[node_num] = self.array[next_node_num] + self.array[next_node_num] = temp + else: + break + node_num = int(node_num/2) + if node_num == 0: + break + + def deleteRoot(self): + root_value = self.array[0] + del self.array[0] + + last_index = len(self.array) - 1 + if last_index < 0: + return root_value + tail_value = self.array[last_index] + del self.array[last_index] + + self.array.insert(0, tail_value) + now_index = 0 + next_index = 0 + while True: + now_index = next_index + next_index *= 2 + if next_index + 2 > last_index: + break + if self.array[next_index + 1] > self.array[next_index + 2]: + next_index += 1 + else: + next_index += 2 + if self.array[now_index] < self.array[next_index]: + temp = self.array[now_index] + self.array[now_index] = self.array[next_index] + self.array[next_index] = temp + return root_value + +if __name__ == '__main__': + m_heap = Heap() + m_heap.insertElement(2) + m_heap.insertElement(4) + m_heap.insertElement(5) + m_heap.insertElement(8) + m_heap.insertElement(2) + m_heap.insertElement(3) + print('Heap :', m_heap) + print('Delete Root :', m_heap.deleteRoot()) + print('Delete Root :', m_heap.deleteRoot()) + print('Delete Root :', m_heap.deleteRoot()) + print('Heap :', m_heap) \ No newline at end of file diff --git a/using_lotto.py b/using_lotto.py new file mode 100644 index 0000000..8d3e213 --- /dev/null +++ b/using_lotto.py @@ -0,0 +1,7 @@ +from lotto_numbering_module import * + +start = input_start() +end = input_end() +count = input_count() + +print_lotto(start, end, count) \ No newline at end of file diff --git "a/\352\270\260\353\212\245\352\260\234\353\260\234.py" "b/\352\270\260\353\212\245\352\260\234\353\260\234.py" new file mode 100644 index 0000000..debb425 --- /dev/null +++ "b/\352\270\260\353\212\245\352\260\234\353\260\234.py" @@ -0,0 +1,33 @@ +def solution(progresses, speeds): + N = len(speeds) + dp = [0]*N + count=0 + answer = [] + + for i in range(N): + dp[i] = ((100 - progresses[i])//speeds[i]) + if((100 - progresses[i])%speeds[i]) != 0: + dp[i]+=1 + + max = dp[0] + for i in range(N): + if max>=dp[i]: + count+=1 + else: + answer.append(count) + count=1 + max=dp[i] + answer.append(count) + return answer + +# 다른사람 풀이 +# -((p-100)//s)는 올림한 양수 +# zip은 동일개수 자료형을 튜플로 묶어주는 함수 +def solution(progresses, speeds): + Q=[] + for p, s in zip(progresses, speeds): + if len(Q)==0 or Q[-1][0]<-((p-100)//s): + Q.append([-((p-100)//s),1]) + else: + Q[-1][1]+=1 + return [q[1] for q in Q] \ No newline at end of file diff --git "a/\353\263\200\354\210\230\353\252\205.PNG" "b/\353\263\200\354\210\230\353\252\205.PNG" new file mode 100644 index 0000000000000000000000000000000000000000..0c94bc38466d4eb5fc37defb219408dff17e1201 GIT binary patch literal 161670 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%0A1N^%BxgyCSHM2K8Z#qCJ2(VQm^3{~ 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
    h$z3wPmc$qebZGs4?c_IA$*ne8DT~KL-ZssG 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 Date: Sun, 18 Jul 2021 20:16:47 +0900 Subject: [PATCH 2/3] all Signed-off-by: chaselover --- ...50\353\213\235\355\212\270\353\246\254.py" | 41 ++++++++ ...53\235\275\354\271\230\352\270\260_DFS.py" | 32 +++++++ ...353\235\275\354\271\230\352\270\260_DP.py" | 17 ++++ ...54\353\247\214\353\223\244\352\270\260.py" | 22 +++++ ...14\355\201\254\354\227\260\352\262\260.py" | 34 +++++++ ...40\234\353\241\234\353\264\207_Kruskal.py" | 87 +++++++++++++++++ ...4\240\234\353\241\234\353\264\207_Prim.py" | 94 +++++++++++++++++++ ... \352\261\264 \354\213\253\354\226\264.py" | 26 +++++ ...1\264 \354\213\253\354\226\264_defalut.py" | 32 +++++++ 9 files changed, 385 insertions(+) create mode 100644 "1197\354\265\234\354\206\214\354\212\244\355\214\250\353\213\235\355\212\270\353\246\254.py" create mode 100644 "14728\353\262\274\353\235\275\354\271\230\352\270\260_DFS.py" create mode 100644 "14728\353\262\274\353\235\275\354\271\230\352\270\260_DP.py" create mode 100644 "1695\355\216\240\353\246\260\353\223\234\353\241\254\353\247\214\353\223\244\352\270\260.py" create mode 100644 "1922\353\204\244\355\212\270\354\233\214\355\201\254\354\227\260\352\262\260.py" create mode 100644 "1944\353\263\265\354\240\234\353\241\234\353\264\207_Kruskal.py" create mode 100644 "1944\353\263\265\354\240\234\353\241\234\353\264\207_Prim.py" create mode 100644 "20922\352\262\271\354\271\230\353\212\224 \352\261\264 \354\213\253\354\226\264.py" create mode 100644 "20922\352\262\271\354\271\230\353\212\224 \352\261\264 \354\213\253\354\226\264_defalut.py" diff --git "a/1197\354\265\234\354\206\214\354\212\244\355\214\250\353\213\235\355\212\270\353\246\254.py" "b/1197\354\265\234\354\206\214\354\212\244\355\214\250\353\213\235\355\212\270\353\246\254.py" new file mode 100644 index 0000000..ca3bbda --- /dev/null +++ "b/1197\354\265\234\354\206\214\354\212\244\355\214\250\353\213\235\355\212\270\353\246\254.py" @@ -0,0 +1,41 @@ +import sys + +input = sys.stdin.readline +V, S = map(int, input().split()) + +# s크루스칼 알고리즘은 sort를 써야하므로 간선 list안에 튜플을 담아준다. +edge = [] +for _ in range(S): + a, b, w = map(int, input().split()) + edge.append((w, a, b)) +# 간선을 에 따라 오름차순 정렬 +edge.sort(key=lambda x: x[0]) + +# 부모노드를 각 노드idx에 맞춰 생성, 매칭해준다. +parent = list(range(V + 1)) + +# union 알고리즘 구현 각 노드가 속한 집합의 대푯값(루트노드)을 구하고 합쳐준다. +def union(a, b): + a = find(a) + b = find(b) + + if b < a: + parent[a] = b + else: + parent[b] = a + +# 루트노드를 찾기위해 재귀로 찾아준다. +def find(a): + if a == parent[a]: + return a + parent[a] = find(parent[a]) # 경로 압축 + return parent[a] + +# 간선을 가중치 낮은것부터 하나씩 꺼내 둘이 다른 집합이라면 MST집합에 이어주고 가중치 값을 더해준다. +sum = 0 +for w, s, e in edge: + if find(s) != find(e): + union(s, e) + sum += w + +print(sum) \ No newline at end of file diff --git "a/14728\353\262\274\353\235\275\354\271\230\352\270\260_DFS.py" "b/14728\353\262\274\353\235\275\354\271\230\352\270\260_DFS.py" new file mode 100644 index 0000000..5b360b7 --- /dev/null +++ "b/14728\353\262\274\353\235\275\354\271\230\352\270\260_DFS.py" @@ -0,0 +1,32 @@ +import sys +input = sys.stdin.readline + + +N,T = map(int,input().split()) +# 여러 단원을 융합한 문제는 출제하지 않는다. +# 한 단원에 한 문제를 출제한다. 단 그 단원에 모든 내용을 알고 있어야 풀수 있다. + +score_table = [list(map(int,input().split())) for _ in range(N)] +score_table.append([1000000000,0]) +check = [False]*101 +max_score = 0 + +def DFS(v,sum_score,sum_time,last_score): + global max_score + if sum_time > T: + max_score = max(max_score,(sum_score-last_score)) + return + for i in range(v,N+1): + if not check[i]: + check[i] = True + sum_time += score_table[i][0] + last_score = score_table[i][1] + sum_score += last_score + DFS(i+1,sum_score,sum_time,last_score) + check[i] = False + sum_time -= score_table[i][0] + sum_score -= last_score + + +DFS(0,0,0,0) +print(max_score) \ No newline at end of file diff --git "a/14728\353\262\274\353\235\275\354\271\230\352\270\260_DP.py" "b/14728\353\262\274\353\235\275\354\271\230\352\270\260_DP.py" new file mode 100644 index 0000000..e19b7aa --- /dev/null +++ "b/14728\353\262\274\353\235\275\354\271\230\352\270\260_DP.py" @@ -0,0 +1,17 @@ +import sys +input = sys.stdin.readline + +N, T = map(int, input().split()) +score_table = [list(map(int,input().split())) for _ in range(N)] +dp = [[0]*(T+1) for _ in range(N+1)] + + +for i in range(1, N+1): #N개 과목에 대해 누적값 검사 + for j in range(1, T+1): #j시간에 대해 누적값 검사. + if j >= score_table[i-1][0]: #i번째 과목을 공부할 수 있는 시간이 되면 공부 시작. + dp[i][j] = max(dp[i-1][j], dp[i-1][j-score_table[i-1][0]] + score_table[i-1][1]) + else: + dp[i][j] = dp[i-1][j] + +print(dp[N][T]) + diff --git "a/1695\355\216\240\353\246\260\353\223\234\353\241\254\353\247\214\353\223\244\352\270\260.py" "b/1695\355\216\240\353\246\260\353\223\234\353\241\254\353\247\214\353\223\244\352\270\260.py" new file mode 100644 index 0000000..80126f1 --- /dev/null +++ "b/1695\355\216\240\353\246\260\353\223\234\353\241\254\353\247\214\353\223\244\352\270\260.py" @@ -0,0 +1,22 @@ +import sys +input = sys.stdin.readline +sys.setrecursionlimit(10000000) + +N = int(input()) +A = list(map(int,input().split())) + +# 앞에서 오는 포인터. + +# 뒤에서 오는 포인터. +# 땡겻을 때 더 작은걸 반환. + +def palindrome(begin,end): + if begin>end: + return 0 + if A[begin] ==A[end]: + result = palindrome(begin +1,end-1) + else: + result = min(1+palindrome(begin+1, end),1+palindrome(begin,end-1)) + return result; + +print(palindrome(0,N-1)) \ No newline at end of file diff --git "a/1922\353\204\244\355\212\270\354\233\214\355\201\254\354\227\260\352\262\260.py" "b/1922\353\204\244\355\212\270\354\233\214\355\201\254\354\227\260\352\262\260.py" new file mode 100644 index 0000000..fbc1539 --- /dev/null +++ "b/1922\353\204\244\355\212\270\354\233\214\355\201\254\354\227\260\352\262\260.py" @@ -0,0 +1,34 @@ +import sys +input = sys.stdin.readline + +N = int(input()) +M = int(input()) + +# 간선정보 정렬 완료. +edge = [list(map(int,input().split())) for _ in range(M)] +edge.sort(key = lambda x : x[2]) + +parent = [i for i in range(N+2)] + +def find(x): + if x == parent[x]: + return x + parent[x] = find(parent[x]) + return parent[x] + +def union(x,y): + x = find(x) + y = find(y) + + parent[x] = y + + + +# MST그리기. +cost = 0 +for a,b,c in edge: + if find(a) != find(b): + union(a,b) + cost += c + +print(cost) \ No newline at end of file diff --git "a/1944\353\263\265\354\240\234\353\241\234\353\264\207_Kruskal.py" "b/1944\353\263\265\354\240\234\353\241\234\353\264\207_Kruskal.py" new file mode 100644 index 0000000..17262d4 --- /dev/null +++ "b/1944\353\263\265\354\240\234\353\241\234\353\264\207_Kruskal.py" @@ -0,0 +1,87 @@ +from collections import deque + + +def is_found(y, x, edges, start, key): + visited = [[0 for i in range(N)] for j in range(N)] + q = deque([(y, x)]) + visited[y][x] = 1 + dy = [0, 1, 0, -1] + dx = [1, 0, -1, 0] + + reps = 1 + while q: + for _ in range(len(q)): + vy, vx = q.popleft() + for i in range(4): + ny = vy + dy[i] + nx = vx + dx[i] + if 0 <= ny < N and 0 <= nx < N and not visited[ny][nx]: + if field[ny][nx] >= 2: + edges.append((reps, start, field[ny][nx])) + q.append((ny, nx)) + key -= 1 + elif field[ny][nx] == 0: + q.append((ny, nx)) + visited[ny][nx] = 1 + reps += 1 + + if key: return False + else: return True + +def find(x, parents): + if parents[x] == x: + return x + parents[x] = find(parents[x], parents) + return parents[x] + +def union(x, y, parents, ranks): + xroot = find(x, parents) + yroot = find(y, parents) + if ranks[xroot] >= ranks[yroot]: + parents[yroot] = xroot + else: + parents[xroot] = yroot + if ranks[xroot] == ranks[yroot]: + ranks[xroot] += 1 + +def kruskal(edges): + parents = [i for i in range(M+3)] + ranks = [0 for i in range(M+3)] + edges.sort() + mst_val = 0 + + for val, s, e in edges: + if find(s, parents) != find(e, parents): + union(s, e, parents, ranks) + mst_val += val + + return mst_val + +def solution(N, M, field): + nodes = [] + idx = 2 + start = 0 + for i in range(N): + for j in range(N): + if field[i][j] == 'S' or field[i][j] == 'K': + if field[i][j] == 'S': start = idx + field[i][j] = idx + idx += 1 + nodes.append((i, j)) + else: + field[i][j] = int(field[i][j]) + + edges = [] + for i in range(N): + for j in range(N): + if field[i][j] >= 2: + if not is_found(i, j, edges, field[i][j], M): + print(-1) + return + + print(kruskal(edges)) + +if __name__ == '__main__': + N, M = map(int, input().split()) + field = [list(input()) for i in range(N)] + solution(N, M, field) \ No newline at end of file diff --git "a/1944\353\263\265\354\240\234\353\241\234\353\264\207_Prim.py" "b/1944\353\263\265\354\240\234\353\241\234\353\264\207_Prim.py" new file mode 100644 index 0000000..fe7f4ff --- /dev/null +++ "b/1944\353\263\265\354\240\234\353\241\234\353\264\207_Prim.py" @@ -0,0 +1,94 @@ +import sys +input = sys.stdin.readline +from collections import deque + + +# S부터 각 K까지 거리, K에서 각 K까지 거리 탐색을 위한 BFS, 각 K자리에 cnt값 기록. +def BFS(x,y,graph,start,key): + dx = [0,0,1,-1] + dy = [1,-1,0,0] + check = [[False]*N for _ in range(N)] + queue = deque() + queue.append([x,y]) + check[x][y] = True + + # reps는 바퀴수(거리) + # 즉 graph에 node번호 e와 가중치 reps를 넣어줌. + reps = 1 + while queue: + for _ in range(len(queue)): + vx,vy = queue.popleft() + for i in range(4): + nx = vx+dx[i] + ny = vy+dy[i] + if 0<=nx= 2: + e = maze[nx][ny] + if graph.get(start): # graph에 start시작점 정점번호, 가중치 있으면 가져와서 하나 더 넣어줌. + graph.get(start).append((e,reps)) # 즉 start라는 key에 정점정보가 계속 담김. + else: + graph[start] = [(e,reps)] # graph에 start시작점 정점번호, 가중치 없으면 선언해줌. + queue.append((nx,ny)) + key -= 1 # key찾을때마다 하나씩 -해서 다 끝났을 떄 key가 남아있으면 false + elif maze[nx][ny] ==0: + queue.append((nx,ny)) + check[nx][ny]=True + reps +=1 + if key: + return False + else: + return True + + +def prim(graph,start,M): + minWeight = [float('inf')] * (M+3) # 최초 가중치 전부 무한대로 key갯수+시작지점 (idx 2부터 시작했으므로 2칸 더 더해줌.) + visited = [0] * (M+3) + minWeight[0] = minWeight[1] = minWeight[start] = 0 # 그냥 준 0,1 idx 요소 0으로 초기화, start요소 0으로 시작. + + for _ in range(2,M+3): # 2번 노드부터 M+2번 노드까지 key+S의 갯수만큼 반복 + minidx, minval = 0,float('inf') + for j in range(2,M+3): + if not visited[j] and minWeight[j] < minval: # j노드에 방문 안했고, j의 최소 가중치가 최소값(연결된 모든 가중치 중의 촤솟값)보다 작으면 (즉 최초 0과 이어져 있는 노드들만) + minval = minWeight[j] # j의 minWeight는 minval(가중치의 값이 가장 작은 것(최솟값을 찾기위함)) + minidx = j # j는 최솟값을 가진 연결된 노드임을 표시 + visited[minidx] = 1 # 최소 가중치를 가진 minidx로 방문. + for e,val in graph.get(minidx): # graph에서 가장 작은 idx의 node번호, 가중치 값을 가져온다. + if not visited[e] and minWeight[e] > val: # 방문안했고 가중치값보다 minWeight에 기록된 가중치가 더 크면 + minWeight[e] = val # 최소가중치값에 가중치값을 저장해준다. + # 위과정을 M+1번 반복한다.(M+1개의 노드를 잇기위해서.) + + return sum(minWeight) # MST의 가중치값 합을 리턴한다. + + + +N,M = map(int,input().split()) +maze = [list(map(str,input().rstrip())) for _ in range(N)] + + +# maze에서 S,K찾기 / S,K는 0,1로부터 구분하기 위해 2부터 시작. +points = [] +idx = 2 +start = 0 +for i in range(N): + for j in range(N): + if maze[i][j] == 'S' or maze[i][j] == 'K': + if maze[i][j] == 'S': + start = idx # start에서 시작하기 위해 'S'를 찾으면 그 idx를 start에 저장함. + maze[i][j] = idx + idx += 1 + points.append([i,j]) + else: + maze[i][j] = int(maze[i][j]) + +graph = dict() +for i in range(N): + for j in range(N): + if maze[i][j] >=2: + if not BFS(i,j,graph,maze[i][j],M): # 모든 열쇠 탐색 불가능 하면 -1출력. + print(-1) + exit() + +print(prim(graph, start,M)) + + + diff --git "a/20922\352\262\271\354\271\230\353\212\224 \352\261\264 \354\213\253\354\226\264.py" "b/20922\352\262\271\354\271\230\353\212\224 \352\261\264 \354\213\253\354\226\264.py" new file mode 100644 index 0000000..a5ca2f0 --- /dev/null +++ "b/20922\352\262\271\354\271\230\353\212\224 \352\261\264 \354\213\253\354\226\264.py" @@ -0,0 +1,26 @@ +import sys +input = sys.stdin.readline +from collections import defaultdict + +N, K = map(int,input().split()) +A = list(map(int,input().split())) + +# 200000이하 N, 같은 정수를 K개 이하 포함한 최장 연속 부분수열. +count = defaultdict(int) +max_length = 0 +last_start = 0 + +for i in range(N): + count[A[i]] += 1 + + if count[A[i]] > K: # 탐색 -> A숫자 count가 K+1개 되면 lenth i-0기록 -> + if max_length < i- last_start: # -> 또 나오면 max_length 비교. 최대면 최신화. + max_length = i- last_start + while count[A[i]] > K: # 처음으로 A숫자 나온 인덱스 뒤부터 재탐색 (시간초과나면 heapq나 deque) + count[A[last_start]] -= 1 # 초기화 되는 index 앞 count 전부 초기화. + last_start +=1 + else: + if max_length < i+1- last_start: # -> 수열 끝까지 가면 max_length 측정 + max_length = i+1- last_start + +print(max_length) \ No newline at end of file diff --git "a/20922\352\262\271\354\271\230\353\212\224 \352\261\264 \354\213\253\354\226\264_defalut.py" "b/20922\352\262\271\354\271\230\353\212\224 \352\261\264 \354\213\253\354\226\264_defalut.py" new file mode 100644 index 0000000..51756e2 --- /dev/null +++ "b/20922\352\262\271\354\271\230\353\212\224 \352\261\264 \354\213\253\354\226\264_defalut.py" @@ -0,0 +1,32 @@ +import sys +input = sys.stdin.readline +from collections import defaultdict + +N, K = map(int,input().split()) +A = list(map(int,input().split())) + +# 200000이하 N, 같은 정수를 K개 이하 포함한 최장 연속 부분수열. +count = defaultdict(int) +point_check = defaultdict(list) +max_length = 0 +last_start = 0 + +for i in range(N): + count[A[i]] += 1 + point_check[A[i]] +=[i] + + if count[A[i]] > K: # 탐색 -> A숫자 count가 K+1개 되면 lenth i-0기록 -> + if max_length < i- last_start: # -> 또 나오면 max_length 비교. 최대면 최신화. + max_length = i- last_start + + for j in range(last_start,point_check[A[i]][0]): #count, point 초기화. + count[A[j]] -= 1 + point_check[A[j]].pop(0) + count[A[i]] -= 1 + last_start = point_check[A[i]].pop(0)+1 # 처음으로 A숫자 나온 인덱스 뒤부터 재탐색 (시간초과나면 heapq나 deque) + + else: + if max_length < i+1- last_start: # -> 수열 끝까지 가면 max_length 측정 + max_length = i+1- last_start + +print(max_length) \ No newline at end of file From 9ccccef6dcd923be33c04e210219184229368a5c Mon Sep 17 00:00:00 2001 From: chaselover Date: Tue, 20 Jul 2021 20:47:34 +0900 Subject: [PATCH 3/3] 0720 --- "1043\352\261\260\354\247\223\353\247\220.py" | 44 +++++++++++++++ ...34\354\227\264\354\236\245\353\202\234.py" | 34 ++++++++++++ ...45\353\247\214\353\223\244\352\270\260.py" | 44 +++++++++++++-- ...54\354\235\230\354\247\200\353\246\204.py" | 37 +++++++++++++ ...4\227\264\354\235\230\355\225\251_comb.py" | 20 +++++++ ...54\227\264\354\235\230\355\225\251_dfs.py" | 21 ++++++++ "1238\355\214\214\355\213\260.py" | 42 +++++++++++++++ ...64\354\235\230\352\261\260\353\246\254.py" | 34 ++++++++++++ ...0\353\260\224\352\274\255\354\247\2102.py" | 41 ++++++++++++++ ...04\353\260\200\353\252\250\354\236\204.py" | 54 +++++++++++++++++++ 14324Rain.py | 42 +++++++++++++++ ...4\354\235\265 \352\263\265\353\266\200.py" | 53 ++++++++++++++++++ ...30\355\202\250\353\260\260\353\213\254.py" | 24 +++++++++ ...45\354\202\254\354\236\245\353\213\230.py" | 42 +++++++++++++++ "1629\352\263\261\354\205\210.py" | 18 +++++++ ...34\353\213\250\352\262\275\353\241\234.py" | 34 ++++++++++++ ...54\354\235\230\354\247\200\353\246\204.py" | 38 +++++++++++++ ...34\355\232\214\354\204\244\352\263\204.py" | 43 +++++++++++++++ ...54\354\235\230\354\210\234\355\232\214.py" | 28 ++++++++++ "2407\354\241\260\355\225\251.py" | 8 +++ ...\353\263\204\354\260\215\352\270\26011.py" | 34 ++++++++++++ ...22\352\265\254\355\225\230\352\270\260.py" | 31 +++++++++++ ...44\355\203\225\353\260\260\353\213\254.py" | 9 ++++ ...dp\353\247\214\353\223\244\352\270\260.py" | 36 +++++++++++++ ...04\353\213\230\355\222\200\354\235\264.py" | 34 ++++++++++++ 8068water.py | 41 ++++++++++++++ ...04\353\260\200\353\262\210\355\230\270.py" | 11 ++++ 27 files changed, 894 insertions(+), 3 deletions(-) create mode 100644 "1043\352\261\260\354\247\223\353\247\220.py" create mode 100644 "10597\354\210\234\354\227\264\354\236\245\353\202\234.py" create mode 100644 "1167\355\212\270\353\246\254\354\235\230\354\247\200\353\246\204.py" create mode 100644 "1182\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251_comb.py" create mode 100644 "1182\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251_dfs.py" create mode 100644 "1238\355\214\214\355\213\260.py" create mode 100644 "1240\353\205\270\353\223\234\354\202\254\354\235\264\354\235\230\352\261\260\353\246\254.py" create mode 100644 "12851\354\210\250\353\260\224\352\274\255\354\247\2102.py" create mode 100644 "13424\353\271\204\353\260\200\353\252\250\354\236\204.py" create mode 100644 14324Rain.py create mode 100644 "1504\355\212\271\354\240\225\355\225\234 \354\265\234\353\213\250 \352\262\275\353\241\234_\353\213\244\354\235\265 \352\263\265\353\266\200.py" create mode 100644 "15686\354\271\230\355\202\250\353\260\260\353\213\254.py" create mode 100644 "15730\354\210\230\354\230\201\354\236\245\354\202\254\354\236\245\353\213\230.py" create mode 100644 "1629\352\263\261\354\205\210.py" create mode 100644 "1753\354\265\234\353\213\250\352\262\275\353\241\234.py" create mode 100644 "1967\355\212\270\353\246\254\354\235\230\354\247\200\353\246\204.py" create mode 100644 "1991\355\212\270\353\246\254\354\210\234\355\232\214\354\204\244\352\263\204.py" create mode 100644 "2263\355\212\270\353\246\254\354\235\230\354\210\234\355\232\214.py" create mode 100644 "2407\354\241\260\355\225\251.py" create mode 100644 "2448\353\263\204\354\260\215\352\270\26011.py" create mode 100644 "2696\354\244\221\354\225\231\352\260\222\352\265\254\355\225\230\352\270\260.py" create mode 100644 "2839\354\204\244\355\203\225\353\260\260\353\213\254.py" create mode 100644 "2900\355\224\204\353\241\234\352\267\270\353\236\250_dp\353\247\214\353\223\244\352\270\260.py" create mode 100644 "2900\355\224\204\353\241\234\352\267\270\353\236\250_\354\204\235\354\247\204\353\213\230\355\222\200\354\235\264.py" create mode 100644 8068water.py create mode 100644 "9933\353\257\274\352\267\240\354\235\264\354\235\230 \353\271\204\353\260\200\353\262\210\355\230\270.py" diff --git "a/1043\352\261\260\354\247\223\353\247\220.py" "b/1043\352\261\260\354\247\223\353\247\220.py" new file mode 100644 index 0000000..2381faf --- /dev/null +++ "b/1043\352\261\260\354\247\223\353\247\220.py" @@ -0,0 +1,44 @@ +# BOJ 1043 거짓말 +# 분리 집합, 그래프 이론 +import sys +input = sys.stdin.readline + +N, M = map(int, input().split()) + +# 거짓말을 하면 안 될 사람들을 담는 스택 +# 진실을 아는 사람의 수는 필요가 없어 슬라이싱 함 +know = list(map(int, input().split()))[1:] + +# 스택에 추가된 적이 있는지 확인하기 위한 리스트 +visit = [0] * N +for k in know: + visit[k-1] = 1 + +parties = [] +for _ in range(M): + guests = list(map(int, input().split()))[1:] # 파티 손님의 수는 필요가 없어 슬라이싱 함 + parties.append(guests) + +party_visit = [0] * M # 진실을 말해야 하는 파티일 경우 1이라고 표기 + +# 스택이 빌때까지 과정 반복 +while know: + known_guest = know.pop() + + candidate = set() # pop된 사람들과 같은 파티에 있는 사람들을 담는 집합 + + # pop된 사람과 같은 파티에 있는 사람들을 찾아 집합에 추가한다. + for party_idx in range(len(parties)): + party = set(parties[party_idx]) + if known_guest in party: # pop된 사람이 현재 파티에 있을 경우 + candidate = candidate.union(party) # 파티의 사람들을 집합에 추가 + party_visit[party_idx] = 1 # 현재 파티를 진실을 말해야 하는 파티라고 표기 + + # 찾은 사람들 중 스택에 추가된 적이 없는 사람들을 스택에 추가 + for guest in candidate: + if not visit[guest - 1]: + know.append(guest) + visit[guest - 1] = 1 + +# 표기되지 않은 파티의 개수를 출력 +print(party_visit.count(0)) \ No newline at end of file diff --git "a/10597\354\210\234\354\227\264\354\236\245\353\202\234.py" "b/10597\354\210\234\354\227\264\354\236\245\353\202\234.py" new file mode 100644 index 0000000..a2bda42 --- /dev/null +++ "b/10597\354\210\234\354\227\264\354\236\245\353\202\234.py" @@ -0,0 +1,34 @@ +import sys +from collections import deque + + +def DFS(idx): + if idx == len(kriii): + high = 0 + for i in range(len(sequence)): + high = max(high,int(sequence[i])) + + if high == len(sequence): + print(*list(map(int,(sequence)))) + sys.exit() + return + + if idx < len(kriii) and int(kriii[idx]) <= 50 and not visited[int(kriii[idx])]: + visited[int(kriii[idx])] = 1 + sequence.append(kriii[idx]) + DFS(idx+1) + sequence.pop() + visited[int(kriii[idx])] = 0 + + if idx + 1 < len(kriii) and int(kriii[idx:idx+2]) <= 50 and not visited[int(kriii[idx:idx+2])]: + visited[int(kriii[idx:idx+2])] = 1 + sequence.append(kriii[idx:idx+2]) + DFS(idx+2) + visited[int(kriii[idx:idx+2])] = 0 + sequence.pop() + + +kriii = input() +sequence = deque() +visited = [0] * 51 +DFS(0) diff --git "a/1113\354\210\230\354\230\201\354\236\245\353\247\214\353\223\244\352\270\260.py" "b/1113\354\210\230\354\230\201\354\236\245\353\247\214\353\223\244\352\270\260.py" index e8490a9..bc5196f 100644 --- "a/1113\354\210\230\354\230\201\354\236\245\353\247\214\353\223\244\352\270\260.py" +++ "b/1113\354\210\230\354\230\201\354\236\245\353\247\214\353\223\244\352\270\260.py" @@ -1,6 +1,44 @@ +from collections import deque +import sys +input = sys.stdin.readline +visited = [] +result = 0 -N,M = map(int,input().split()) -matrix = [list(map(int,list(map(str,input().split())))) for _ in range(N)] +def bfs(x, y, h): + global result + dx = [-1, 0, 0, 1] + dy = [0, -1, 1, 0] + queue = deque([(x, y)]) + out_flag = True + visited[x][y] = 1 + cnt = 1 #1인것들 카운트 센다. + while True: + x, y = queue.popleft() + for i in range(4): + rx = x + dx[i] + ry = y + dy[i] #바깥쪽이랑 연결된 부분은 버린다.(물 못담음) + if rx == -1 or rx == N or ry == -1 or ry == M: + out_flag = False + continue + if board[rx][ry] <= h and visited[rx][ry] == 0: + visited[rx][ry] = 1 + queue.append((rx, ry)) + cnt += 1 + if not queue: + if out_flag: + result += cnt + return -# 일단 \ No newline at end of file +N, M = map(int, input().split()) +board = [list(map(int, list(input().rstrip()))) for _ in range(N)] + +# 우리는 밑에서부터 한칸씩 채운다. 1~8높이까지. +for height in range(1, 9): + visited = [[0] * M for _ in range(N)] + # 중간에 고립된 부분들이 있으므로 모든 칸에서 다 bfs를 돌려본다. + for i in range(N): + for j in range(M): + if board[i][j] <= height and visited[i][j] == 0: + bfs(i, j, height) +print(result) diff --git "a/1167\355\212\270\353\246\254\354\235\230\354\247\200\353\246\204.py" "b/1167\355\212\270\353\246\254\354\235\230\354\247\200\353\246\204.py" new file mode 100644 index 0000000..ca4397d --- /dev/null +++ "b/1167\355\212\270\353\246\254\354\235\230\354\247\200\353\246\204.py" @@ -0,0 +1,37 @@ +import sys +from collections import deque,defaultdict + +input = sys.stdin.readline +V = int(input()) +graph = defaultdict(list) + +for _ in range(V): + c = list(map(int, input().split())) + for e in range(1, len(c) - 2, 2): + graph[c[0]].append(c[e:e + 2]) + + +def bfs(v): + visited = [-1] * (V + 1) + queue = deque() + queue.append(v) + visited[v] = 0 + max_node = [0, 0] + + while queue: + t = queue.popleft() + for e, w in graph[t]: + if visited[e] == -1: + visited[e] = visited[t] + w + queue.append(e) + if max_node[0] < visited[e]: + max_node = visited[e], e + + return max_node + + +dist, node = bfs(1) +dist, node = bfs(node) +print(dist) + +# 트리의 지름(그래프 간 가장 먼 노드 사이의 거리) = 아무 노드에서 최장 노드, 그 노드에서 다시한번 최장노드 = 지름 \ No newline at end of file diff --git "a/1182\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251_comb.py" "b/1182\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251_comb.py" new file mode 100644 index 0000000..2f184f3 --- /dev/null +++ "b/1182\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251_comb.py" @@ -0,0 +1,20 @@ +import sys +input = sys.stdin.readline +from itertools import combinations + + +N,S = map(int,input().split()) +super_set = list(map(int,input().split())) +cnt = 0 + +# 1개뽑는조합~n개뽑는조합까지 모든 부분집합에 대해 조사 가능. +# 부분집합의 요소들의 합이s가 되는지만 조사하고 버림. +for i in range(1,N+1) : + sub_set = list(combinations(super_set,i)) + for c in sub_set : + if sum(c) == S : + cnt +=1 + +print(cnt) + + diff --git "a/1182\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251_dfs.py" "b/1182\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251_dfs.py" new file mode 100644 index 0000000..459b019 --- /dev/null +++ "b/1182\353\266\200\353\266\204\354\210\230\354\227\264\354\235\230\355\225\251_dfs.py" @@ -0,0 +1,21 @@ +import sys +input = sys.stdin.readline + +# 처음 첫요소,합0으로 들어가서 sum요소에 자기value더해주고 자기를포함하는 재귀와 포함하지 않는 재귀로 나눠서 다음 idx진행. +# 부분집합은 결국 요소를 포함하느냐 안하느냐 0과1인데서 착안한 탐색. +def dfs(idx, sum): + global cnt + if idx >= n: + return + sum += s_[idx] + if sum == s: + cnt += 1 + dfs(idx + 1, sum - s_[idx]) + dfs(idx + 1, sum) + + +n, s = map(int, input().split()) +s_ = list(map(int, input().split())) +cnt = 0 +dfs(0, 0) +print(cnt) \ No newline at end of file diff --git "a/1238\355\214\214\355\213\260.py" "b/1238\355\214\214\355\213\260.py" new file mode 100644 index 0000000..5067754 --- /dev/null +++ "b/1238\355\214\214\355\213\260.py" @@ -0,0 +1,42 @@ +import sys +from heapq import heappush, heappop +input = sys.stdin.readline + + +n, m, x = map(int, input().split()) +inf = 100000000 +s = [[] for i in range(n + 1)] +dp = [inf] * (n + 1) +s_r = [[] for i in range(n + 1)] +dp_r = [inf] * (n + 1) + + +def dijkstra(start, dp, s): + heap = [] + dp[start] = 0 + heappush(heap, [0, start]) + while heap: + w, n = heappop(heap) + if dp[n] < w: + continue + for n_n, wei in s[n]: + n_w = wei + w + if n_w < dp[n_n]: + dp[n_n] = n_w + heappush(heap, [n_w, n_n]) + + +for i in range(m): + a, b, t = map(int, input().split()) + s[a].append([b, t]) + s_r[b].append([a, t]) + + +dijkstra(x, dp, s) +dijkstra(x, dp_r, s_r) + + +max_ = 0 +for i in range(1, n + 1): + max_ = max(max_, dp[i] + dp_r[i]) +print(max_) \ No newline at end of file diff --git "a/1240\353\205\270\353\223\234\354\202\254\354\235\264\354\235\230\352\261\260\353\246\254.py" "b/1240\353\205\270\353\223\234\354\202\254\354\235\264\354\235\230\352\261\260\353\246\254.py" new file mode 100644 index 0000000..69d235e --- /dev/null +++ "b/1240\353\205\270\353\223\234\354\202\254\354\235\264\354\235\230\352\261\260\353\246\254.py" @@ -0,0 +1,34 @@ +import sys +input = sys.stdin.readline +from collections import defaultdict,deque + +def Distance(a,b): + queue = deque() + queue.append(a) + visited = [False]*(N+1) + visited[a] = True + target_dist = [0]*(N+1) + while queue: + v = queue.popleft() + if v==b: + print(target_dist[v]) + return + for next,dist in graph[v]: + if not visited[next]: + queue.append(next) + visited[next] = True + target_dist[next] += target_dist[v] +dist + + +N,M = map(int,input().split()) +graph = defaultdict(list) + + +for _ in range(N-1): + a,b,dist = map(int,input().split()) + graph[a].append((b,dist)) + graph[b].append((a,dist)) + +for _ in range(M): + a,b = map(int,input().split()) + Distance(a,b) \ No newline at end of file diff --git "a/12851\354\210\250\353\260\224\352\274\255\354\247\2102.py" "b/12851\354\210\250\353\260\224\352\274\255\354\247\2102.py" new file mode 100644 index 0000000..68d869a --- /dev/null +++ "b/12851\354\210\250\353\260\224\352\274\255\354\247\2102.py" @@ -0,0 +1,41 @@ +import sys +from collections import deque +input = sys.stdin.readline + +n, k = list(map(int, input().split())) + +def bfs(n): + # visited[next] : next 까지 오는데 얼마의 최소 time을 저장. + # ways[next] : next 까지 최소 time으로 오는 방법의 수 저장. + q, visited, ways = deque([n]), [float('inf')]*100001, [0]*100001 + time, success = 0, False + ways[n] = 1 + visited[n] = 0 + +# 한 size씩 측정해 그 사이즈까지만 돌리고 성공했으면 빠져나옴. + while q and not success: + size = len(q) + + for _ in range(size): + v = q.popleft() + + for next in [v-1, v+1, v*2]: + if 0<= next <= 100000 and time + 1 <= visited[next]: + ways[next] += 1 + visited[next] = time + 1 + + if next == k: + success = True + + if not success: + q.append(next) + time += 1 + + return visited[k], ways[k] +if n >= k: + print(n-k) + print(1) +else: + time, count = bfs(n) + print(time) + print(count) \ No newline at end of file diff --git "a/13424\353\271\204\353\260\200\353\252\250\354\236\204.py" "b/13424\353\271\204\353\260\200\353\252\250\354\236\204.py" new file mode 100644 index 0000000..3a5a08f --- /dev/null +++ "b/13424\353\271\204\353\260\200\353\252\250\354\236\204.py" @@ -0,0 +1,54 @@ +import sys +input = sys.stdin.readline +from heapq import heappop, heappush +from collections import defaultdict + + + +# 각 친구들 위치에서 모든 방에 대해 최소거리 배열 출력. +# 최소 거리 찾는 것이므로 나중에 min쓸꺼 대비해 누적거리는 inf부터 시작함. +def dijkstra(start): + global dp_dists + dp_dists = [float('inf')] * (N + 1) + heap = [] + dp_dists[start] = 0 + heappush(heap, [dp_dists[start], start]) + while heap: + cur_dist, cur_node = heappop(heap) + if dp_dists[cur_node] < cur_dist: + continue + for next_node, next_dist in graph[cur_node]: + dist = next_dist + cur_dist + if dist < dp_dists[next_node]: + dp_dists[next_node] = dist + heappush(heap, [dist, next_node]) + return dp_dists + + +# N개의 방(1~N번) +# M개의 통로(양방향), 가중치 +# 친구 K명 +for test in range(int(input())): + N,M = map(int,input().split()) + graph = defaultdict(list) + + for _ in range(M): + a,b,dist = map(int,input().split()) + graph[a].append((b,dist)) + graph[b].append((a,dist)) + + + # 모든 친구들은 최단 경로를 이용해서 방으로 모일것임. + K = int(input()) + friends_start = list(map(int,input().split())) + sum_dists = [0]*(N+1) + for start in friends_start: + dijkstra(start) + for i in range(len(dp_dists)): + sum_dists[i] += dp_dists[i] + + # 모임장소는 모든 친구들의 이동경로 합이 최소가 되는 방. + for i in range(1,N+1): + if sum_dists[i] ==min(sum_dists): + print(i) + break \ No newline at end of file diff --git a/14324Rain.py b/14324Rain.py new file mode 100644 index 0000000..29f3743 --- /dev/null +++ b/14324Rain.py @@ -0,0 +1,42 @@ +import sys +input = sys.stdin.readline +from collections import deque + + +def BFS(x,y,h): + global result + queue = deque() + queue.append([x,y]) + dx = [0,0,1,-1] + dy = [1,-1,0,0] + out_rain = False + cnt = 1 + visited[x][y] = True + while queue: + x,y = queue.popleft() + for i in range(4): + nx = x+dx[i] + ny = y+dy[i] + if 0<=nx min_dists[cur_node]: + continue + for next_dists,next_node in graph[cur_node]: + dists = cur_dists + next_dists + if dists < min_dists[next_node]: + min_dists[next_node] = dists + heappush(heap,[min_dists[next_node],next_node]) + return min_dists + +V,E = map(int,input().split()) +K = int(input()) +graph = defaultdict(list) + +for _ in range(E): + u,v,w = map(int,input().split()) + graph[u].append([w,v]) + +dijkstra(K) + +for i in range(1,V+1): + print(min_dists[i] if not min_dists[i] == float('inf') else 'INF') \ No newline at end of file diff --git "a/1967\355\212\270\353\246\254\354\235\230\354\247\200\353\246\204.py" "b/1967\355\212\270\353\246\254\354\235\230\354\247\200\353\246\204.py" new file mode 100644 index 0000000..996fcee --- /dev/null +++ "b/1967\355\212\270\353\246\254\354\235\230\354\247\200\353\246\204.py" @@ -0,0 +1,38 @@ +import sys +from collections import deque,defaultdict +input = sys.stdin.readline + +n = int(input()) +graph = defaultdict(list) + +for _ in range(n-1): + a,b,c = map(int,input().split()) + graph[a].append((b,c)) + graph[b].append((a,c)) + + + +def bfs(v): + visited = [-1] * (n + 1) + queue = deque() + queue.append(v) + visited[v] = 0 + max_node = [0, 0] + + while queue: + t = queue.popleft() + for e, w in graph[t]: + if visited[e] == -1: + visited[e] = visited[t] + w + queue.append(e) + if max_node[0] < visited[e]: + max_node = visited[e], e + + return max_node + + +dist, node = bfs(1) +dist, node = bfs(node) +print(dist) + +# 트리의 지름(그래프 간 가장 먼 노드 사이의 거리) = 아무 노드에서 최장 노드, 그 노드에서 다시한번 최장노드 = 지름 \ No newline at end of file diff --git "a/1991\355\212\270\353\246\254\354\210\234\355\232\214\354\204\244\352\263\204.py" "b/1991\355\212\270\353\246\254\354\210\234\355\232\214\354\204\244\352\263\204.py" new file mode 100644 index 0000000..b4c415c --- /dev/null +++ "b/1991\355\212\270\353\246\254\354\210\234\355\232\214\354\204\244\352\263\204.py" @@ -0,0 +1,43 @@ +class Node: + def __init__(self, item, left, right): + self.item = item + self.left = left + self.right = right + + +def inorder(node): + if node.left !='.': + inorder(tree[node.left]) + print(node.item, end='') + if node.right!='.': + inorder(tree[node.right]) + +def postorder(node): + if node.left !='.': + postorder(tree[node.left]) + if node.right!='.': + postorder(tree[node.right]) + print(node.item, end='') + +def preorder(node): + print(node.item, end='') + if node.left !='.': + preorder(tree[node.left]) + if node.right!='.': + preorder(tree[node.right]) + + + +N = int(input()) +tree={} + +for _ in range(N): + node,left,right = map(str, input().split()) + tree[node] = Node(item=node, left=left, right=right) + + +preorder(tree['A']) +print() +inorder(tree['A']) +print() +postorder(tree['A']) \ No newline at end of file diff --git "a/2263\355\212\270\353\246\254\354\235\230\354\210\234\355\232\214.py" "b/2263\355\212\270\353\246\254\354\235\230\354\210\234\355\232\214.py" new file mode 100644 index 0000000..1103f8b --- /dev/null +++ "b/2263\355\212\270\353\246\254\354\235\230\354\210\234\355\232\214.py" @@ -0,0 +1,28 @@ +import sys +sys.setrecursionlimit(10**6) + +n = int(input()) +in_order = list(map(int, input().split())) +post_order = list(map(int, input().split())) + +pos = [0]*(n+1) +for i in range(n): + pos[in_order[i]] = i # 중위 순회로 부모노드의 위치에서 왼쪽에 몇개있나 알수있음 + + +def divide(in_start, in_end, p_start, p_end): # 중위 시작, 끝, 후위시작, 끝 / 트리 나누면서 계속 나누어감.(트리 나눌때마다 인덱스 조정을 위한 것.) + if(in_start > in_end) or (p_start > p_end): + return + parents = post_order[p_end] # 후위순회에서 부모노드 찾기 (후위순회의 마지막 노드가 루트) / 후위순회의 뒤에있을수록 level이 낮은 node(부모노드) + print(parents, end=" ") + + left = pos[parents] - in_start # 왼쪽인자 갯수 (루트노드기준 왼쪽) + right = in_end - pos[parents] # 오른쪽인자 갯수 (루트노드기준 오른쪽) + + divide(in_start, in_start+left-1, p_start, p_start+left-1) # 왼쪽 트리(왼쪽 부분트리로 들어가 거기서 부모노드 찾고 왼쪽 오른쪽 나눈다.) 중위 시작 똑같고 끝은 왼쪽갯수-1인덱스고 후위시작 똑같고 후위끝 왼쪽 갯수-1 + divide(in_end-right+1, in_end, p_end-right, p_end-1) # 오른쪽 트리 (오른쪽 부모노드 찾고 왼쪽 오른쪽 나눈다.) 중위 시작 중위끝에서 오른쪽갯수만큼 뺀것. 중위 끝 똑같고 후위 시작은 후위 끝에서 오른쪽 갯수만큼 빼고 후위끝은 그냥 -1인덱스. + +divide(0, n-1, 0, n-1) + + + diff --git "a/2407\354\241\260\355\225\251.py" "b/2407\354\241\260\355\225\251.py" new file mode 100644 index 0000000..43c792f --- /dev/null +++ "b/2407\354\241\260\355\225\251.py" @@ -0,0 +1,8 @@ +n,m=map(int,input().split()) + +comb = 1 +for i in range(n-m+1,n+1): + comb *= i +for i in range(1,m+1): + comb = comb // i +print(comb) \ No newline at end of file diff --git "a/2448\353\263\204\354\260\215\352\270\26011.py" "b/2448\353\263\204\354\260\215\352\270\26011.py" new file mode 100644 index 0000000..8ed64e7 --- /dev/null +++ "b/2448\353\263\204\354\260\215\352\270\26011.py" @@ -0,0 +1,34 @@ +import sys +input = sys.stdin.readline + + +# 정복 +def Conquer(shift): + c = len(tri) #최초 3 (즉 세로줄 수) + for i in range(c): #triangle 한줄씩 꺼냄. + tri.append(tri[i] + tri[i]) #tri.append(tri[i] + tri[i]) 3일때그림아래쪽에 바로 2개를 그림. + tri[i] = (" " * shift + tri[i] + " " * shift) #tri[i] = (" "*shift + tri[i] + " " * shift) + #아래쪽에 트리 두개 더한 그림을 그렸다면 원래 있던 그림에도 한줄씩 꺼내 " "공백을 + #삐져나온만큼 더해준다. + #그럼 세로 3줄 -> 6줄 -> 12줄 -> 24줄 각 줄당 두줄씩 K번 더 그려지게된다. +# 입력 +tri = [" * "," * * ","***** "] # 삼각형 밑변끼리 붙지 않도록 오른쪽 한칸 띄어야함. +N = int(input()) + + +# 분할 + +k=0 +N = N//3 +while N != 1 : + N = N//2 + k +=1 +# 조합 +for i in range(k): + Conquer(int(pow(2,i))) #pow는 i승을 의미. 스페이스를 매k마다 2배씩 더 그려야 하기 때문. +for stars in tri: + print(stars) + + + + diff --git "a/2696\354\244\221\354\225\231\352\260\222\352\265\254\355\225\230\352\270\260.py" "b/2696\354\244\221\354\225\231\352\260\222\352\265\254\355\225\230\352\270\260.py" new file mode 100644 index 0000000..072e1eb --- /dev/null +++ "b/2696\354\244\221\354\225\231\352\260\222\352\265\254\355\225\230\352\270\260.py" @@ -0,0 +1,31 @@ +import sys +input = sys.stdin.readline + + + +for test in range(int(input())): + M = int(input()) + + # 여러줄 입력을 한 리스트에 -> extend써야 배열 +연산처럼 들어감 + seqs = [] + for i in range(M//10+1): + seqs.extend(list(map(int,input().split()))) + + # 출력하는 갯수 : 홀수의 갯수. + print(M//2+1) + + # M=1일때 index에러 대비해서 따로 빼줌. + print(seqs[0], end=" ") + + # count이용 출력 숫자 10개로 조절. 줄바꿈. + # for else문으로 반복문 끝났을 때 한칸띄어서 다음 입력이 깔끔하게 제어. + if M !=1: + cnt=1 + for i in range(2,M,2): + print(sorted(seqs[:i+1])[(i+1)//2], end=" ") + cnt+=1 + if cnt==10: + print() + cnt=0 + else: + print() \ No newline at end of file diff --git "a/2839\354\204\244\355\203\225\353\260\260\353\213\254.py" "b/2839\354\204\244\355\203\225\353\260\260\353\213\254.py" new file mode 100644 index 0000000..d7bd2a7 --- /dev/null +++ "b/2839\354\204\244\355\203\225\353\260\260\353\213\254.py" @@ -0,0 +1,9 @@ +N = int(input()) +dp = [float('inf')]* 5001 + +dp[3] = 1 +dp[5] = 1 +for i in range(6,N+1): + dp[i] = min(dp[i],dp[i-3]+1,dp[i-5]+1) + +print(dp[N] if dp[N] != float('inf') else -1) \ No newline at end of file diff --git "a/2900\355\224\204\353\241\234\352\267\270\353\236\250_dp\353\247\214\353\223\244\352\270\260.py" "b/2900\355\224\204\353\241\234\352\267\270\353\236\250_dp\353\247\214\353\223\244\352\270\260.py" new file mode 100644 index 0000000..a0dd7ac --- /dev/null +++ "b/2900\355\224\204\353\241\234\352\267\270\353\236\250_dp\353\247\214\353\223\244\352\270\260.py" @@ -0,0 +1,36 @@ +import sys +input = sys.stdin.readline + +N, K = map(int,input().split()) +X_list = list(map(int,input().split())) + + +# X_list 숫자 갯수 저장. +x_sum = [0]*N +for jump in X_list: + x_sum[jump] += 1 + + +# 각 위치에서 가지는 숫자값.즉 배열 a완성. +x_dp = [x_sum[1]]*N +for i in range(2,N): + for j in range(0,N,i): + x_dp[j] += x_sum[i] + + +# 누적합 +dp = [0] * N +dp[0] = K +for i in range(1,N): + dp[i] = dp[i-1] + x_dp[i] + + +# 출력은 Q줄. +# L,R이 주어졌을 때 a[L] + a[L+1] + ... + a[R] 출력 +for _ in range(int(input())): + L,R = map(int,input().split()) + print(dp[R]-dp[L-1] if L else dp[R]) + + + + diff --git "a/2900\355\224\204\353\241\234\352\267\270\353\236\250_\354\204\235\354\247\204\353\213\230\355\222\200\354\235\264.py" "b/2900\355\224\204\353\241\234\352\267\270\353\236\250_\354\204\235\354\247\204\353\213\230\355\222\200\354\235\264.py" new file mode 100644 index 0000000..63becde --- /dev/null +++ "b/2900\355\224\204\353\241\234\352\267\270\353\236\250_\354\204\235\354\247\204\353\213\230\355\222\200\354\235\264.py" @@ -0,0 +1,34 @@ +import sys +input = sys.stdin.readline + +n, k = map(int,input().split()) +x_list = list(map(int,input().split())) +q = int(input()) + +# x를 압축함 -> 효율성 +x_zip = [0] * n +for x in x_list: + x_zip[x] += 1 + +# 배열을 구함 +dp = [x_zip[1]] * n # x=1 일때는 미리 빼둠 +dp_sum = [0] * (n+1) + +for x in range(2, n): + for i in range(0, n, x): + dp[i] += x_zip[x] + +# 배열의 부분합 구함 +dp_sum[1] = dp[0] +for i in range(1, n): + dp_sum[i+1] = dp_sum[i] + dp[i] + +# 출력 +for _ in range(q): + l,r = map(int,input().split()) + res = dp_sum[r+1]-dp_sum[l] + + print(res) + +# 큰 복잡도만 따지는게 아니라 n^2이 몇배까지 허용되는지 따져야 하는 효율성 관리 고난도 문제 +# 결국 x_list의 최적화가 핵심인듯 \ No newline at end of file diff --git a/8068water.py b/8068water.py new file mode 100644 index 0000000..368da53 --- /dev/null +++ b/8068water.py @@ -0,0 +1,41 @@ +import sys +input = sys.stdin.readline +from collections import deque + + +def BFS(x,y,h): + global result + queue = deque() + queue.append([x,y]) + dx = [0,0,1,-1] + dy = [1,-1,0,0] + out_rain = False + cnt = 1 + visited[x][y] = True + while queue: + x,y = queue.popleft() + for i in range(4): + nx = x+dx[i] + ny = y+dy[i] + if 0<=nx