[{"data":1,"prerenderedAt":1077},["ShallowReactive",2],{"post-document:\u002Falgorithm\u002Fpython\u002F2026\u002F08\u002F31\u002Fcore-algorithms\u002F":3},{"id":4,"title":5,"body":6,"categories":1058,"date":1061,"description":1062,"extension":1063,"image":1064,"key_concepts":1064,"last_modified_at":1064,"legacyPath":1065,"meta":1066,"navigation":81,"part":1064,"path":1068,"published":81,"robots":1064,"seo":1069,"series":1064,"stem":1070,"strengths":1064,"summary":1064,"tags":1071,"tradeoffs":1064,"__hash__":1076},"posts\u002Fposts\u002FAlgorithm\u002FPython 코테\u002F7일의 전사.md","코딩 테스트 핵심 알고리즘 정리",{"type":7,"value":8,"toc":1046},"minimark",[9,13,17,20,30,33,39,43,46,58,107,110,118,121,127,130,135,140,143,163,167,174,212,214,220,227,251,255,258,362,366,369,375,378,382,385,393,396,404,408,411,416,424,427,433,480,483,486,500,503,506,517,521,555,565,568,606,610,634,636,650,653,656,662,668,711,714,796,809,811,828,831,836,840,905,908,915,918,921,924,929,932,935,946,949,952,955,961,964,969,972,978,981,984,990,1000,1003,1005,1009,1012,1015,1018,1021,1023,1027,1030,1033,1036,1042],[10,11,12],"h1",{"id":12},"그리디",[14,15,16],"p",{},"그리디는 매 순간 가장 좋아 보이는 선택을 하는 방법이다.",[14,18,19],{},"그리디가 최적의 답을 보장하려면 해당 문제에 다음과 같은 성질이 필요하다.",[21,22,23,27],"ul",{},[24,25,26],"li",{},"그리디 선택 속성: 현재의 최선 선택이 최종 최적해에도 포함된다.",[24,28,29],{},"최적 부분 구조: 전체 문제의 최적해가 부분 문제의 최적해로 구성된다.",[14,31,32],{},"그리디는 빠르고 단순하지만, 현재의 최선이 전체의 최선으로 이어진다는 근거가 있는 문제에서만 최적의 답을 보장한다.",[34,35,36],"blockquote",{},[14,37,38],{},"그런데 그걸 어떻게 판단하지?",[10,40,42],{"id":41},"완전-탐색","완전 탐색",[14,44,45],{},"가능한 경우를 모두 탐색하는 방법이다.",[47,48,49,52,55],"ol",{},[24,50,51],{},"가능한 경우를 모두 만든다.",[24,53,54],{},"각각 조건에 맞는지 확인한다.",[24,56,57],{},"조건을 만족하는 것 중 정답을 선택한다.",[59,60,65],"pre",{"className":61,"code":62,"language":63,"meta":64,"style":64},"language-python shiki shiki-themes github-light github-dark","numbers = [1, 2, 3, 4]\n\nfor i in range(len(numbers)):\n    for j in range(i + 1, len(numbers)):\n        if numbers[i] + numbers[j] == 5:\n            print(numbers[i], numbers[j])\n","python","",[66,67,68,76,83,89,95,101],"code",{"__ignoreMap":64},[69,70,73],"span",{"class":71,"line":72},"line",1,[69,74,75],{},"numbers = [1, 2, 3, 4]\n",[69,77,79],{"class":71,"line":78},2,[69,80,82],{"emptyLinePlaceholder":81},true,"\n",[69,84,86],{"class":71,"line":85},3,[69,87,88],{},"for i in range(len(numbers)):\n",[69,90,92],{"class":71,"line":91},4,[69,93,94],{},"    for j in range(i + 1, len(numbers)):\n",[69,96,98],{"class":71,"line":97},5,[69,99,100],{},"        if numbers[i] + numbers[j] == 5:\n",[69,102,104],{"class":71,"line":103},6,[69,105,106],{},"            print(numbers[i], numbers[j])\n",[14,108,109],{},"실제로 확인하는 순서는 아래와 같다.",[59,111,116],{"className":112,"code":114,"language":115,"meta":64},[113],"language-text","1 + 2 = 3\n1 + 3 = 4\n1 + 4 = 5 ✅\n2 + 3 = 5 ✅\n2 + 4 = 6\n3 + 4 = 7\n","text",[66,117,114],{"__ignoreMap":64},[14,119,120],{},"출력 결과는 다음과 같다.",[59,122,125],{"className":123,"code":124,"language":115,"meta":64},[113],"1 4\n2 3\n",[66,126,124],{"__ignoreMap":64},[14,128,129],{},"모든 조합을 확인하기 때문에 정답을 놓치지 않는다.",[131,132,134],"h2",{"id":133},"완전-탐색의-대표적인-구현-방법","완전 탐색의 대표적인 구현 방법",[136,137,139],"h3",{"id":138},"_1-반복문","1. 반복문",[14,141,142],{},"경우의 수가 단순하고 작을 때 사용한다.",[59,144,146],{"className":61,"code":145,"language":63,"meta":64,"style":64},"for i in range(10):\n    for j in range(10):\n        # 모든 i, j 확인\n",[66,147,148,153,158],{"__ignoreMap":64},[69,149,150],{"class":71,"line":72},[69,151,152],{},"for i in range(10):\n",[69,154,155],{"class":71,"line":78},[69,156,157],{},"    for j in range(10):\n",[69,159,160],{"class":71,"line":85},[69,161,162],{},"        # 모든 i, j 확인\n",[136,164,166],{"id":165},"_2-순열과-조합","2. 순열과 조합",[14,168,169,170,173],{},"파이썬에서는 ",[66,171,172],{},"itertools","를 사용할 수 있다.",[59,175,177],{"className":61,"code":176,"language":63,"meta":64,"style":64},"from itertools import combinations\n\nnumbers = [1, 2, 3, 4]\n\nfor selected in combinations(numbers, 2):\n    if sum(selected) == 5:\n        print(selected)\n",[66,178,179,184,188,192,196,201,206],{"__ignoreMap":64},[69,180,181],{"class":71,"line":72},[69,182,183],{},"from itertools import combinations\n",[69,185,186],{"class":71,"line":78},[69,187,82],{"emptyLinePlaceholder":81},[69,189,190],{"class":71,"line":85},[69,191,75],{},[69,193,194],{"class":71,"line":91},[69,195,82],{"emptyLinePlaceholder":81},[69,197,198],{"class":71,"line":97},[69,199,200],{},"for selected in combinations(numbers, 2):\n",[69,202,203],{"class":71,"line":103},[69,204,205],{},"    if sum(selected) == 5:\n",[69,207,209],{"class":71,"line":208},7,[69,210,211],{},"        print(selected)\n",[14,213,120],{},[59,215,218],{"className":216,"code":217,"language":115,"meta":64},[113],"(1, 4)\n(2, 3)\n",[66,219,217],{"__ignoreMap":64},[14,221,222,223,226],{},"순서가 중요하면 ",[66,224,225],{},"permutations()","를 사용한다.",[59,228,230],{"className":61,"code":229,"language":63,"meta":64,"style":64},"from itertools import permutations\n\nfor selected in permutations([1, 2, 3], 2):\n    print(selected)\n",[66,231,232,237,241,246],{"__ignoreMap":64},[69,233,234],{"class":71,"line":72},[69,235,236],{},"from itertools import permutations\n",[69,238,239],{"class":71,"line":78},[69,240,82],{"emptyLinePlaceholder":81},[69,242,243],{"class":71,"line":85},[69,244,245],{},"for selected in permutations([1, 2, 3], 2):\n",[69,247,248],{"class":71,"line":91},[69,249,250],{},"    print(selected)\n",[136,252,254],{"id":253},"_3-dfs와-백트래킹","3. DFS와 백트래킹",[14,256,257],{},"선택을 여러 단계 반복해야 하는 경우에 사용한다.",[59,259,261],{"className":61,"code":260,"language":63,"meta":64,"style":64},"numbers = [1, 2, 3]\nselected = []\n\n\ndef dfs(index):\n    if index == len(numbers):\n        print(selected)\n        return\n\n    # 현재 숫자를 선택\n    selected.append(numbers[index])\n    dfs(index + 1)\n    selected.pop()\n\n    # 현재 숫자를 선택하지 않음\n    dfs(index + 1)\n\n\ndfs(0)\n",[66,262,263,268,273,277,281,286,291,295,301,306,312,318,324,330,335,341,346,351,356],{"__ignoreMap":64},[69,264,265],{"class":71,"line":72},[69,266,267],{},"numbers = [1, 2, 3]\n",[69,269,270],{"class":71,"line":78},[69,271,272],{},"selected = []\n",[69,274,275],{"class":71,"line":85},[69,276,82],{"emptyLinePlaceholder":81},[69,278,279],{"class":71,"line":91},[69,280,82],{"emptyLinePlaceholder":81},[69,282,283],{"class":71,"line":97},[69,284,285],{},"def dfs(index):\n",[69,287,288],{"class":71,"line":103},[69,289,290],{},"    if index == len(numbers):\n",[69,292,293],{"class":71,"line":208},[69,294,211],{},[69,296,298],{"class":71,"line":297},8,[69,299,300],{},"        return\n",[69,302,304],{"class":71,"line":303},9,[69,305,82],{"emptyLinePlaceholder":81},[69,307,309],{"class":71,"line":308},10,[69,310,311],{},"    # 현재 숫자를 선택\n",[69,313,315],{"class":71,"line":314},11,[69,316,317],{},"    selected.append(numbers[index])\n",[69,319,321],{"class":71,"line":320},12,[69,322,323],{},"    dfs(index + 1)\n",[69,325,327],{"class":71,"line":326},13,[69,328,329],{},"    selected.pop()\n",[69,331,333],{"class":71,"line":332},14,[69,334,82],{"emptyLinePlaceholder":81},[69,336,338],{"class":71,"line":337},15,[69,339,340],{},"    # 현재 숫자를 선택하지 않음\n",[69,342,344],{"class":71,"line":343},16,[69,345,323],{},[69,347,349],{"class":71,"line":348},17,[69,350,82],{"emptyLinePlaceholder":81},[69,352,354],{"class":71,"line":353},18,[69,355,82],{"emptyLinePlaceholder":81},[69,357,359],{"class":71,"line":358},19,[69,360,361],{},"dfs(0)\n",[131,363,365],{"id":364},"언제-사용할까","언제 사용할까?",[14,367,368],{},"먼저 경우의 수가 작은지 충분히 계산해야 한다.",[59,370,373],{"className":371,"code":372,"language":115,"meta":64},[113],"N = 10, 2^N = 1,024      → 가능\nN = 20, 2^N = 약 100만   → 보통 가능\nN = 50, 2^N = 약 1,000조 → 사실상 불가능\n",[66,374,372],{"__ignoreMap":64},[14,376,377],{},"대략 파이썬에서는 연산량이 수백만에서 수천만 정도라면 문제의 시간 제한에 따라 시도할 수 있다.",[10,379,381],{"id":380},"그리디와-완전-탐색-비교","그리디와 완전 탐색 비교",[131,383,12],{"id":384},"그리디-1",[21,386,387,390],{},[24,388,389],{},"지금 가장 좋아 보이는 것만 선택한다.",[24,391,392],{},"빠르지만 최적해를 놓칠 수 있다.",[131,394,42],{"id":395},"완전-탐색-1",[21,397,398,401],{},[24,399,400],{},"가능한 모든 경우를 확인한다.",[24,402,403],{},"경우의 수가 많으면 시간이 오래 걸린다.",[10,405,407],{"id":406},"dp","DP",[14,409,410],{},"핵심 논리는 다음과 같다.",[34,412,413],{},[14,414,415],{},"현재 답을 이전에 구한 답으로 만들 수 있는가?",[21,417,418,421],{},[24,419,420],{},"이전 계산 결과를 저장해서 재사용한다.",[24,422,423],{},"같은 계산을 반복하지 않도록 이전 결과를 저장한다.",[14,425,426],{},"예를 들어 피보나치 수열은 다음과 같은 관계를 가진다.",[59,428,431],{"className":429,"code":430,"language":115,"meta":64},[113],"f(5) = f(4) + f(3)\nf(4) = f(3) + f(2)\n",[66,432,430],{"__ignoreMap":64},[59,434,436],{"className":61,"code":435,"language":63,"meta":64,"style":64},"n = 5\ndp = [0] * (n + 1)\n\ndp[1] = 1\n\nfor i in range(2, n + 1):\n    dp[i] = dp[i - 1] + dp[i - 2]\n\nprint(dp[n])  # 5\n",[66,437,438,443,448,452,457,461,466,471,475],{"__ignoreMap":64},[69,439,440],{"class":71,"line":72},[69,441,442],{},"n = 5\n",[69,444,445],{"class":71,"line":78},[69,446,447],{},"dp = [0] * (n + 1)\n",[69,449,450],{"class":71,"line":85},[69,451,82],{"emptyLinePlaceholder":81},[69,453,454],{"class":71,"line":91},[69,455,456],{},"dp[1] = 1\n",[69,458,459],{"class":71,"line":97},[69,460,82],{"emptyLinePlaceholder":81},[69,462,463],{"class":71,"line":103},[69,464,465],{},"for i in range(2, n + 1):\n",[69,467,468],{"class":71,"line":208},[69,469,470],{},"    dp[i] = dp[i - 1] + dp[i - 2]\n",[69,472,473],{"class":71,"line":297},[69,474,82],{"emptyLinePlaceholder":81},[69,476,477],{"class":71,"line":303},[69,478,479],{},"print(dp[n])  # 5\n",[14,481,482],{},"동적 계획법은 이전 결과를 저장하고, 다음 계산 때 꺼내서 쓴다.",[14,484,485],{},"대표 문제는 다음과 같다.",[21,487,488,491,494,497],{},[24,489,490],{},"피보나치",[24,492,493],{},"계단 오르기",[24,495,496],{},"최소 비용 구하기",[24,498,499],{},"배낭 문제",[10,501,502],{"id":502},"해시",[14,504,505],{},"특정 값이 존재하는지 또는 값에 대응하는 정보를 빠르게 찾는 구조다.",[14,507,508,509,512,513,516],{},"파이썬에서는 주로 ",[66,510,511],{},"dict","와 ",[66,514,515],{},"set","을 사용한다.",[131,518,520],{"id":519},"dict-값과-정보를-연결","dict, 값과 정보를 연결",[59,522,524],{"className":61,"code":523,"language":63,"meta":64,"style":64},"scores = {\n    \"민수\": 90,\n    \"영희\": 85,\n}\n\nprint(scores[\"민수\"])  # 90\n",[66,525,526,531,536,541,546,550],{"__ignoreMap":64},[69,527,528],{"class":71,"line":72},[69,529,530],{},"scores = {\n",[69,532,533],{"class":71,"line":78},[69,534,535],{},"    \"민수\": 90,\n",[69,537,538],{"class":71,"line":85},[69,539,540],{},"    \"영희\": 85,\n",[69,542,543],{"class":71,"line":91},[69,544,545],{},"}\n",[69,547,548],{"class":71,"line":97},[69,549,82],{"emptyLinePlaceholder":81},[69,551,552],{"class":71,"line":103},[69,553,554],{},"print(scores[\"민수\"])  # 90\n",[14,556,557,560,561,564],{},[66,558,559],{},"\"민수\"","라는 Key와 ",[66,562,563],{},"90","이라는 Value가 연결되어 있다.",[14,566,567],{},"개수를 셀 때도 많이 사용한다.",[59,569,571],{"className":61,"code":570,"language":63,"meta":64,"style":64},"numbers = [1, 2, 1, 3, 1]\ncounts = {}\n\nfor number in numbers:\n    counts[number] = counts.get(number, 0) + 1\n\nprint(counts)  # {1: 3, 2: 1, 3: 1}\n",[66,572,573,578,583,587,592,597,601],{"__ignoreMap":64},[69,574,575],{"class":71,"line":72},[69,576,577],{},"numbers = [1, 2, 1, 3, 1]\n",[69,579,580],{"class":71,"line":78},[69,581,582],{},"counts = {}\n",[69,584,585],{"class":71,"line":85},[69,586,82],{"emptyLinePlaceholder":81},[69,588,589],{"class":71,"line":91},[69,590,591],{},"for number in numbers:\n",[69,593,594],{"class":71,"line":97},[69,595,596],{},"    counts[number] = counts.get(number, 0) + 1\n",[69,598,599],{"class":71,"line":103},[69,600,82],{"emptyLinePlaceholder":81},[69,602,603],{"class":71,"line":208},[69,604,605],{},"print(counts)  # {1: 3, 2: 1, 3: 1}\n",[131,607,609],{"id":608},"set-존재-여부-확인","set, 존재 여부 확인",[59,611,613],{"className":61,"code":612,"language":63,"meta":64,"style":64},"members = {\"민수\", \"영희\", \"철수\"}\n\nif \"영희\" in members:\n    print(\"존재함\")\n",[66,614,615,620,624,629],{"__ignoreMap":64},[69,616,617],{"class":71,"line":72},[69,618,619],{},"members = {\"민수\", \"영희\", \"철수\"}\n",[69,621,622],{"class":71,"line":78},[69,623,82],{"emptyLinePlaceholder":81},[69,625,626],{"class":71,"line":85},[69,627,628],{},"if \"영희\" in members:\n",[69,630,631],{"class":71,"line":91},[69,632,633],{},"    print(\"존재함\")\n",[14,635,485],{},[21,637,638,641,644,647],{},[24,639,640],{},"중복 확인",[24,642,643],{},"등장 횟수 세기",[24,645,646],{},"전화번호나 이름 검색",[24,648,649],{},"두 숫자의 합 찾기",[10,651,652],{"id":652},"스택",[14,654,655],{},"스택은 나중에 넣은 값을 먼저 꺼내는 자료구조다.",[59,657,660],{"className":658,"code":659,"language":115,"meta":64},[113],"넣기: 1 → 2 → 3\n꺼내기: 3 → 2 → 1\n",[66,661,659],{"__ignoreMap":64},[14,663,169,664,667],{},[66,665,666],{},"list","로 구현한다.",[59,669,671],{"className":61,"code":670,"language":63,"meta":64,"style":64},"stack = []\n\nstack.append(1)\nstack.append(2)\nstack.append(3)\n\nprint(stack.pop())  # 3\nprint(stack.pop())  # 2\n",[66,672,673,678,682,687,692,697,701,706],{"__ignoreMap":64},[69,674,675],{"class":71,"line":72},[69,676,677],{},"stack = []\n",[69,679,680],{"class":71,"line":78},[69,681,82],{"emptyLinePlaceholder":81},[69,683,684],{"class":71,"line":85},[69,685,686],{},"stack.append(1)\n",[69,688,689],{"class":71,"line":91},[69,690,691],{},"stack.append(2)\n",[69,693,694],{"class":71,"line":97},[69,695,696],{},"stack.append(3)\n",[69,698,699],{"class":71,"line":103},[69,700,82],{"emptyLinePlaceholder":81},[69,702,703],{"class":71,"line":208},[69,704,705],{},"print(stack.pop())  # 3\n",[69,707,708],{"class":71,"line":297},[69,709,710],{},"print(stack.pop())  # 2\n",[14,712,713],{},"대표적인 예는 괄호 검사다.",[59,715,717],{"className":61,"code":716,"language":63,"meta":64,"style":64},"text = \"(())\"\nstack = []\n\nfor char in text:\n    if char == \"(\":\n        stack.append(char)\n    else:\n        if not stack:\n            print(\"잘못된 괄호\")\n            break\n        stack.pop()\nelse:\n    if not stack:\n        print(\"올바른 괄호\")\n    else:\n        print(\"잘못된 괄호\")\n",[66,718,719,724,728,732,737,742,747,752,757,762,767,772,777,782,787,791],{"__ignoreMap":64},[69,720,721],{"class":71,"line":72},[69,722,723],{},"text = \"(())\"\n",[69,725,726],{"class":71,"line":78},[69,727,677],{},[69,729,730],{"class":71,"line":85},[69,731,82],{"emptyLinePlaceholder":81},[69,733,734],{"class":71,"line":91},[69,735,736],{},"for char in text:\n",[69,738,739],{"class":71,"line":97},[69,740,741],{},"    if char == \"(\":\n",[69,743,744],{"class":71,"line":103},[69,745,746],{},"        stack.append(char)\n",[69,748,749],{"class":71,"line":208},[69,750,751],{},"    else:\n",[69,753,754],{"class":71,"line":297},[69,755,756],{},"        if not stack:\n",[69,758,759],{"class":71,"line":303},[69,760,761],{},"            print(\"잘못된 괄호\")\n",[69,763,764],{"class":71,"line":308},[69,765,766],{},"            break\n",[69,768,769],{"class":71,"line":314},[69,770,771],{},"        stack.pop()\n",[69,773,774],{"class":71,"line":320},[69,775,776],{},"else:\n",[69,778,779],{"class":71,"line":326},[69,780,781],{},"    if not stack:\n",[69,783,784],{"class":71,"line":332},[69,785,786],{},"        print(\"올바른 괄호\")\n",[69,788,789],{"class":71,"line":337},[69,790,751],{},[69,792,793],{"class":71,"line":343},[69,794,795],{},"        print(\"잘못된 괄호\")\n",[14,797,798,801,802,805,806,808],{},[66,799,800],{},"(","를 만나면 저장하고, ",[66,803,804],{},")","를 만나면 가장 최근의 ",[66,807,800],{},"를 제거한다.",[14,810,485],{},[21,812,813,816,819,822,825],{},[24,814,815],{},"괄호 검사",[24,817,818],{},"뒤로 가기",[24,820,821],{},"실행 취소",[24,823,824],{},"DFS",[24,826,827],{},"가장 가까운 큰 수 찾기",[14,829,830],{},"핵심 질문은 다음과 같다.",[34,832,833],{},[14,834,835],{},"가장 최근에 저장한 값을 먼저 확인해야 하는가?",[10,837,839],{"id":838},"한눈에-비교","한눈에 비교",[841,842,843,859],"table",{},[844,845,846],"thead",{},[847,848,849,853,856],"tr",{},[850,851,852],"th",{},"개념",[850,854,855],{},"핵심 역할",[850,857,858],{},"파이썬 구현",[860,861,862,877,890],"tbody",{},[847,863,864,867,870],{},[865,866,407],"td",{},[865,868,869],{},"계산 결과 재사용",[865,871,872,874,875],{},[66,873,666],{},", ",[66,876,511],{},[847,878,879,881,884],{},[865,880,502],{},[865,882,883],{},"빠른 검색, 개수 세기",[865,885,886,874,888],{},[66,887,511],{},[66,889,515],{},[847,891,892,894,897],{},[865,893,652],{},[865,895,896],{},"최근 값부터 처리",[865,898,899,874,902],{},[66,900,901],{},"list.append()",[66,903,904],{},"list.pop()",[10,906,907],{"id":907},"heap",[14,909,910,911,914],{},"파이썬에서는 heapq를 사용한다. 기본은 최소 힙이라서 가장 작은 값이 heap",[69,912,913],{},"0","에 있다.",[14,916,917],{},"힙(Heap)은 가장 큰 값 또는 가장 작은 값을 빠르게 꺼내기 위한 자료구조",[14,919,920],{},"예를 들어 숫자를 이렇게 넣었다고 치자 (5,2,8,1)",[14,922,923],{},"최소 힙에서는 항상 가장 작은 1을 먼저 꺼낼 수 있고, 최대 힙에서는 항상 가장 큰 8을 꺼낼 수 있다.\n다만 내부가 완전히 정렬이 되어있지 않다. 최소 힙은 오직 다음 규칙만 지킨다.",[34,925,926],{},[14,927,928],{},"부모가 자식보다 작거나 같다.",[14,930,931],{},"그래서 최소 힙의 맨 위에는 항상 최솟값이 있다.",[14,933,934],{},"시간은 보통 다음과 같다.",[21,936,937,940,943],{},[24,938,939],{},"값 후기",[24,941,942],{},"최솟값 또는 최댓값 제거 : O(log n)",[24,944,945],{},"최솟값 또는 최댓값 확인 : O(1)",[14,947,948],{},"정렬은 전체 순서가 필요할 때 사용하고, 힙은 현재 가장 작은 것 하나를 반복해서 선택해야 할 때 유용",[14,950,951],{},"예를 들면 작업 우선순위, 가장 짧은 경로를 찾는 다익스트라, 가장 작은 음식 두 개를 계속 섞는 문제등에 사용된다.",[14,953,954],{},"파이썬의 heapq는 기본적으로 최소 힙",[14,956,957,958,960],{},"파이썬에써는 heapq를 사용. 기본은 최소 힙이라서 가장 작은 값이 항상 heap",[69,959,913],{},"에 있어.",[14,962,963],{},"import heapq",[14,965,966,967],{},"heap = ",[69,968],{},[14,970,971],{},"heapq.heappush(heap, 5)\nheapq.heappush(heap, 2)\nheapq.heappush(heap, 8)\nheapq.heappush(heap, 1)",[14,973,974,975,977],{},"print(heap",[69,976,913],{},") # 1.최솟값 확인\nprint(heapq.heappop(heap)) # 1. 최솟값 제거\nprint(heapq.heappop(heap))",[14,979,980],{},"heap 리스트 전체가 정렬된 모습은 아님",[14,982,983],{},"print(heap)",[14,985,986,987,989],{},"출력된 리스트가 완전히 정렬되어 있지 않아도 heap",[69,988,913],{},"은 항상 최솟값이다.\n기존 리스트를 힙으로 바꾸려면 heapify()를 사용한다.",[14,991,992,993,996,997,999],{},"numbers = ",[69,994,995],{},"5,2,8,1","\nheapq.heapify(numbers)\nprint(numbers",[69,998,913],{},") #1",[14,1001,1002],{},"최대 립이 필요하면 가장 간단하게 값에 -를 붙인다.",[14,1004,963],{},[14,1006,966,1007],{},[69,1008],{},[14,1010,1011],{},"heapq.heappush(heap,-5)\nheapq.heappush(heap,-2)\nheapq.heappush(heap,-8)",[14,1013,1014],{},"maximum = -heapq.heappop(heap)",[14,1016,1017],{},"print(maximum)  # 8",[14,1019,1020],{},"우선순위를 함께 저장할 때는 튜플을 넣으면 돼. 튜플의 첫 번째 값부터 비교",[14,1022,963],{},[14,1024,966,1025],{},[69,1026],{},[14,1028,1029],{},"heapq.heappush(heap, (2, \"청소\"))\nheapq.heappush(heap, (1, \"공부\"))\nheapq.heappush(heap, (3, \"게임\"))",[14,1031,1032],{},"priority, task = heapq.heappop(heap)",[14,1034,1035],{},"print(priority, task)",[14,1037,1038,1039,1041],{},"heapq.heappush(heap, value)  # 추가\nheapq.heappop(heap)          # 최솟값 제거하고 반환\nheap",[69,1040,913],{},"                      # 최솟값 확인만 하기",[1043,1044,1045],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":64,"searchDepth":78,"depth":78,"links":1047},[1048,1053,1054,1055,1056,1057],{"id":133,"depth":78,"text":134,"children":1049},[1050,1051,1052],{"id":138,"depth":85,"text":139},{"id":165,"depth":85,"text":166},{"id":253,"depth":85,"text":254},{"id":364,"depth":78,"text":365},{"id":384,"depth":78,"text":12},{"id":395,"depth":78,"text":42},{"id":519,"depth":78,"text":520},{"id":608,"depth":78,"text":609},[1059,1060],"Algorithm","Python","2026-08-31 00:00:00 +0900","그리디, 완전 탐색, DP, 해시, 스택의 핵심 개념과 파이썬 구현 방법을 정리한다.","md",null,"\u002Falgorithm\u002Fpython\u002F2026\u002F08\u002F31\u002Fcore-algorithms\u002F",{"layout":1067},"post","\u002Fposts\u002Falgorithm\u002Fpython\u002F7",{"title":5,"description":1062},"posts\u002FAlgorithm\u002FPython 코테\u002F7일의 전사",[1060,1059,1072,1073,407,1074,1075],"Greedy","Brute Force","Hash","Stack","E2qF8miZ1Iuq3o1DHHJeZzvMGxb5y3UvKu8JWlREXTU",1788744784106]