프로그래머스 - 같은 숫자는 싫어

같은 숫자는 싫어 문제 바로가기 나의 풀이 def solution(arr): answer = [arr[0]] from collections import deque arr = deque(arr[1:]) while arr: temp = arr.popleft() if temp != answer[-1]: answer.append(temp) return answer 고수의 풀이 def no_continuous(s): a = [] for i in s: if a[-1:] == [i]: continue a.append(i) return a CODE REVIEW queue을 활용한 문제. for문으로 arr의 원소 하나씩 뽑아올수도 있겠지만, 시간초과우려가 있기에 deque을 활용했다. arr.pop(0)보다 deque을 이용해서 arr.popleft()가 탐색 속도가 빠르다. answer = [arr[0]] arr = deque(arr[1:])로 설정하지 않으면 indexError가 발생하기 때문에 주의해야 한다. 이런 indexError을 효과적으로 방지하기 위해 고수의 풀이에서는 a[-1:]을 이용했다.

2023-6-19 · 1 min · 94 words · Junha

프로그래머스 - 기능개발

기능개발 문제 바로가기 나의 풀이 def solution(progresses, speeds): import math answer = [] days = [] for p, s in zip(progresses, speeds): days.append(math.ceil((100-p)/s)) print(days) count = 1 temp = days[0] for i in range(1,len(days)): if temp < days[i]: answer.append(count) count = 1 temp = days[i] else: count += 1 return answer + [count] 고수의 풀이 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] CODE REVIEW zip()을 이용해서 각 과정 별 소요시간을 계산하고, 비교를 통해 답을 구해나가는 문제! 고수의 풀이에서는 math.ceil 사용하지 않고 -((p-100)//s)을 통해 올림을 구현했다. 근데 웬만하면 math.ceil 사용하자 ㅋㅋㅋ

2023-6-19 · 1 min · 106 words · Junha

프로그래머스 - 요격 시스템

요격 시스템 문제 바로가기 나의 풀이 def solution(targets): count = 0 current = 0 targets.sort(key=lambda x: x[1]) for t in targets: if current <= t[0]: current = t[1] count += 1 return count CODE REVIEW 최댓값을 구하라 해서 미사일 배치를 어떻게 해야할지 막막했는데, targets을 오름차순으로 정렬하면 풀기가 편리해진다. 첫 번째 미사일을 범위로 정하고 다음 미사일들이 이 범위에 속하는지 아닌지를 확인하며 진행하는 방식이다. x[0]이 아닌 x[1]을 key로 정렬하는 이유는, 예제에서 볼 수 있듯이 최솟값을 기준으로 하면 반례가 생기기 때문이다.

2023-5-30 · 1 min · 78 words · Junha

프로그래머스 - 카드 뭉치

카드 뭉치 문제 바로가기 나의 풀이 def solution(cards1, cards2, goal): answer = "Yes" while goal: c = goal.pop(0) if cards1[0] == c: cards1.pop(0) cards1.append('') elif cards2[0] == c: cards2.pop(0) cards2.append('') else: return "No" return answer CODE REVIEW 큐를 이용하면 생각보다 간단하게 해결 가능한 문제였다. goal의 head부터 하나하나씩 cards1와 cards2의 head와 동일한지 확인해주고, 둘 다 동일하지 않다면 “No"를 return하면 되었다. TIP! pop(0)해준 뒤에 빈 문자열 ''을 append해주어야 indexError가 발생하지 않는다.

2023-5-29 · 1 min · 69 words · Junha

백준 1966번 - 프린터 큐

백준 1966번 바로가기 나의 풀이 for _ in range(int(input())): n, i = map(int, input().split()) queue = list(map(int, input().split())) count = 0 while queue: i -= 1 if max(queue) == (out:=queue.pop(0)): count += 1 if i < 0: print(count) break else: queue.append(out) if i < 0: i = len(queue) -1 고수의 풀이 for _ in range(int(input())): n,m=map(int,input().split()) t=list(map(int,input().split())) a=sorted(t, reverse=True);j=0 i=0 while True: if a[j] == t[i]: j+=1 if i == m: print(j) break i=(i+1)%n 출처 CODE REVIEW 관심있는 대상이 out되는지 아닌지 판단하는 과정이 은근 까다로운 문제였다. out될 때까지 count를 하나씩 늘려나가는 방식이었다. 고수의 풀이를 보면, 애초에 중요도를 내림차순으로 정렬하고, 기존의 중요도 리스트와 비교하면서 count을 세어나갔다.

2023-5-19 · 1 min · 105 words · Junha