[정렬] 병합 정렬 [Merge Sort]
병합 또는 합병 정렬에 대해 알아보자. 이는 분할 정복 방법을 통해 구현한다. (분할 정복은 큰 문제를 작은 문제 단위로 쪼개면서, 쉽게 풀 수 있는 문제 단위로 나눈 뒤 그것들을 다시 합치는 방식이다.) 퀵 정렬과 함께 빠른 정렬에 해당한다. 예를 들어보자. [6, 5, 3, 1, 8, 7, 2, 4] 숫자 1 ~ 8까지 들어있는 배열이 있다. 먼저 하나의 배열을 두 개로 쪼갠다. [6, 5, 3, 1] [8, 7, 2, 4] 그리고 다시 각 배열을 두 개로 쪼갠다. [6, 5] [3, 1] [8, 7] [2, 4] 또다시 각 배열을 두 개로 쪼갠다. [6] [5] [3] [1] [8] [7] [2] [4] 이제 더 이상 배열을 쪼갤 수 없다. 이제 두 개의 배열씩 합친다. 합칠 때는 둘 중에 값이 더..
[프로그래머스][Python] 가장 큰 수
문제를 정리해보자. "주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다." 주어진 정수를 이용해 가장 큰 수를 만들면 된다. 처음에는 완전 탐색을 시도했다. 하지만 시간초과로 실패했다. 두 번째에는 DFS를 시도했다. 하지만 구현에 어려움을 겪어 포기했다. 알고 보니 푸는 방법은 간단했다. 먼저 제한 사항을 보자. 예를 들어 [8, 883] 있다. 원소의 크기가 0이상 1,000 이하이므로, 각 원소를 문자열로 보고 3을 곱해준다. (1,000이 최대여서 4를 곱할 필요가 없다.) [888, 8838838883] 주의해야 할 점은 [0, 0, 0, 0] 같은 예이다. 0000이라는 수는 없다. 0으로..
[프로그래머스][Python] K번째수
조건에 따라서 array[i] ~ array[j]까지 정렬하고, k번째 원소가 무엇인지 찾으면 된다. def solution(array, commands): answer = [] for com in commands: i, j, k = com tmp = sorted(array[i-1:j]) answer.append(tmp[k-1]) return answer print(solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]])) 다른 사람 풀이를 보자. def solution(array, commands): return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands)) lambda를..
[프로그래머스][Python] 다리를 지나는 트럭
입력은 3개가 주어진다. bridge_length : 다리에 올라갈 수 있는 트럭 수 weight : 다리가 견딜 수 있는 무게 truck_weights : 트럭별 무게 문제는 '모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는가?'이다. 아래처럼 이해하면 편하다. bridge_length는 다리의 길이이다. 다리의 길이가 N이라면, N대가 올라갈 수 있다. 그리고 1대만 지나가는데 N초가 걸린다. 그리고 다리에서 완전히 나가야지 건넜다고 할 수 있다. [7, 4, 5, 6]를 스택형태로 이동시켜보자. 0 : [x,x] [] (시작) 1 : [x,7] [] 2 : [7,x] [] 3 :[x,4] [7] 4 : [4,5] [7] 5 : [5,x] [4,7] 6 : [x,6] [5,4,7] 7 : [6,x]..
[대회][BOJ][INU 코드페스티벌 2020] D번 20365 : 블로그2
문제를 정리해 보자. 문제를 해결한 경우 파란색, 해결하지 못한 경우 빨간색으로 칠한다. 각 문제를 칠할 때 아래와 같은 과정을 한 번의 작업으로 수행한다. 1. 연속된 임의의 문제들을 선택한다. 2. 선택된 문제들을 전부 원하는 같은 색으로 칠한다. 단순히 위에서 아래로 칠해보자. 횟수 번호 1 1,2 2 3 3 4 4 5 5 6,7 6 8 최소한의 작업 횟수로 수행해보자. 이를 구현해야 한다. 횟수 번호 1 1,2,3,4,5,6,7 2 3 3 5 4 8 어떻게 구현해야 할까? 아래 방법처럼 하면 된다. (아래는 다른 예시이다.) 연속된 동일 알파벳은 하나의 알파벳으로 본다. 즉, 중복을 제거한다. (중복이 제거되었기 때문에 R과 B가 교차로 있게 된다.) R의 개수와 B의 개수 중, 더 큰 것은 한 ..