본문 바로가기

알고리즘/프로그래머스

(45)
[프로그래머스][Python] 카펫 문제를 정리하자. 1. 안쪽은 노란색으로 칠해져 있고, 테두리 '1줄'은 갈색으로 칠해져 있는 격자 모양의 카펫이 있다. 2. 현재 노란색과 갈색으로 색칠된 격자의 개수를 알고 있다. 3. 가로 길이는 세로의 길이보다 길거나 같다. 전체 카펫의 가로와 세로의 길이를 구하여라. brown = 24, yellow = 24일 때를 생각해보자. 가로의 총합, 세로의 총합은 모두 짝수이다. (가로도, 세로도 변의 개수가 짝수이기 때문이다.) 따라서 brown 가로의 길이를 구하기 위해, 2씩 빼면서 경우의 수를 나열해보자. 주의할 점은 1. 가로 길이의 총합이 길이가 전체 길이가 되면 안 된다. 세로 길이의 총합이 0이 되기 때문이다. 2. 가로의 길이는 세로의 길이보다 길거나 같다. 가로 총합: 24(x) ->..
[프로그래머스][Python] 모의고사 문제를 정리해보자. 수포자 1, 2, 3 모두는 규칙적으로 정답을 찍는다. 실제 정답이 들어있는 배열과 수포자들의 정답을 비교해서 정답을 가장 많이 맞힌 수포자를 찾으면 된다. (1명 이상이다.) from collections import deque def solution(answers): l = len(answers) su_1 = deque([1, 2, 3, 4, 5]) # 5 su_2 = deque([2, 1, 2, 3, 2, 4, 2, 5]) # 8 su_3 = deque([3, 3, 1, 1, 2, 2, 4, 4, 5, 5]) # 10 result = [0, 0, 0] # 정답 비교 for num in answers: if num == su_1[0]: result[0] += 1 if num == ..
[프로그래머스][Python] 이중우선순위큐 문제를 정리해보자. l 숫자 => 큐에 숫자 삽입 D 1 => 큐에서 최댓값 삭제 D -1 => 큐에서 최솟값 삭제 단, 큐가 비어있는 상태에서 D 명령이 들어오면 무시한다. 최종 결과는 큐가 비어있다면 [0, 0]으로 아니라면, [최댓값, 최솟값]으로 출력한다. 리스트에 값을 넣을 때마다 정렬하는 방법을 선택했다. from collections import deque def solution(operations): li = [] for string in operations: alpha, num = string.split() if alpha == "I": # 삽입 li.append(int(num)) li = deque(sorted(li)) elif li: if alpha == "D" and num == "..
[프로그래머스][Python] H-Index 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다. 문제를 잘 이해해보자. 1) h번 이상 인용된 논문이 h편 이상이다. 2) 나머지 논문은 h번 이하 인용한다. 1), 2)를 만족하는 h의 최댓값을 구하여라 위 예시처럼, 먼저 배열을 오름차순으로 정렬한다. 정렬하면 n - index는 해당 값의 편 수가 된다. ( 물론 내림차순으로 하고 index + 1을 편 수로 잡아도 된다. ) 이때 각 값의 h값은 value와 n - index 중 더 작은 값이 된다. 예를 들어, 9번 이상은 4편이 있다. 여기서 h값으로 최대는 4이다. 그리고 2)는 고려할 필요가 없다. 무조건 만족하기 때문이다. 추..
[프로그래머스][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] 주식가격 주식가격이 내려가지 않은 기간은 몇 초인지 파악하는 문제이다. # 가격이 내려가지 않은 기간 from collections import deque def solution(prices): answer = [] prices = deque(prices) while prices: now = prices.popleft() result = 0 if not prices: result = 0 else: for val in prices: result += 1 if val < now: break answer.append(result) return answer print(solution([1, 2, 3, 2, 3])) 처음 들어간 값이 먼저나오는 Queue(FIFO)구조로 동작한다. 이렇게 풀게 되면 N + (N - 1) ..
[프로그래머스][Python] 더 맵게 문제를 정리해보자. 모든 음식의 지수를 K이상으로 만들어야 한다. 하나라도 K이상이 아니라면, 2개의 음식을 섞어서 새로운 음식을 만든다. 새로운 음식 = 가장 맵지 않은 음식의 지수 + (두 번째로 맵지 않은 음식의 지수 X 2) 모든 음식의 지수가 K라면 그만한다. 음식이 1개 남았는데, K보다 작다면 -1을 출력한다. Heap을 이용했다. import heapq def solution(scoville, K): answer = 0 heap = [] for num in scoville: heapq.heappush(heap, num) check = heap[0] while check < K: if len(heap) < 2: return -1 x = heapq.heappop(heap) y = heapq.h..
[프로그래머스][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]..
[프로그래머스][Python] 프린터 순서도가 높은 인쇄 문서부터 인쇄하면 된다. 요청한 문서가 몇 번째로 인쇄되는지 구하는 문제이다. # A, B, C, D # 2 1 3 2 import collections def solution(priorities, location): priorities_cnt = dict((collections.Counter(priorities).items())) priorities_idx = [(num, idx) for idx, num in enumerate(priorities)] location = (priorities[location], location) answer = 0 while priorities_idx: check = priorities_idx[0][0] if check == max(priorities..