오늘도 8시 출근 완료! 7시 2-30분쯤 집에서 나오면 아직 해가 뜨지 않아 보라색 하늘을 볼 수 있다. 너무 예뻐서 카메라에 담고 싶지만 안 담긴다는... 이른 아침에도 움직이는 사람들이 많다. 다들 열심히 산다는 걸 눈으로 보며 자극받는다.
프로그래머스 <프린터> 문제 보기
https://school.programmers.co.kr/learn/courses/30/lessons/42587
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
프로그래머스 <프린터> 문제 풀이
from collections import deque
def solution(priorities, location):
check = 0
p = deque(priorities)
result = deque()
while True:
check = p[0]
if max(p) > check:
if location == 0:
location += len(p) -1
else:
location -= 1
p.append(p.popleft())
else:
if location == 0:
break
else:
result.append(p.popleft())
location -= 1
return len(result)+1
deque를 사용해 문제를 풀었다. priorities의 맨앞 값보다 큰 값이 있는지 체크한 후 location 값을 조절해주었다. 경우의 수를 따져 원초적으로 해결한 방법이라 가독성은 좋을지 몰라도 좋은 코드는 아닌 거 같다. 처음에는 문제 이해를 잘못해서 이상하게 풀었는데, 문제를 다시 꼼꼼히 읽은 후에는 금방 풀어낼 수 있었다. 받은 점수를 봐도 그렇게 어려운 문제는 아니었다!
다른 풀이
def solution(priorities, location):
answer = 0
array1 = [c for c in range(len(priorities))] # index 위치 저장
array2 = priorities.copy() # 값 저장 (출력되는 값)
i = 0
while True:
if array2[i] < max(array2[i+1:]):
array1.append(array1.pop(i))
array2.append(array2.pop(i))
else:
i += 1
if array2 == sorted(array2, reverse=True):
break
return array1.index(location) + 1
deque를 사용하지 않고 list만으로 푼 풀이도 있었다. 처음 priorities의 인덱스를 저장한 array1과 priorities를 복사하여 정렬할 리스트를 담은 array2 두 개의 list를 사용하여 구현한 방법이다. 문서를 대기목록에서 꺼냈다가 다시 마지막에 넣을 때 array1의 인덱스와 array2의 값을 모두 이동시켜줌으로써 추후에 값이 모두 정렬되었을 때 location으로 순서를 출력할 수 있도록 한 로직이다.
def solution(priorities, location):
priorities = [(v, idx) for idx, v in enumerate(priorities)]
count = 0
while True:
if priorities[0][0] == max(priorities)[0]:
count += 1
if priorities[0][1] == location:
break
priorities.pop(0)
else:
priorities.append(priorities.pop(0))
return count
enumerate를 사용하여 priorities를 리스트 값과 인덱스를 모두 담은 객체로 바꾸어 계산해준 방법이다. 만약 맨 앞의 값이 priorities의 max값과 같다면 인쇄한 것으로 보고 count를 증가시켜주었으며 이때 location값이 일치한다면 while문을 빠져나와 이때의 count 값을 return 해주도록 한 로직이다.
어쩌다보니 프로그래머스 [코딩테스트 고득점 Kit]의 스택/큐 부분 6문제를 모두 다 풀어버렸다. 6개월 전에는 오늘 푼 '프린터'나 어제 푼 '다리를 지나는 트럭'을 도전해볼 용기조차 가지지 못했는데 그만큼 성장했다는 뜻이겠지? 6개월동안 따로 코딩테스트 준비를 했던 것은 아니니 이번 방학 2달 간 열심히 알고리즘 공부를 한다면 그래프 문제나 Level 3까지도 정복할 수 있지 않을까라는 자신감이 새어나온다. 하루를 기분 좋게 시작한 것 같다 :)
'알고리즘 공부 > 코딩테스트(프로그래머스)' 카테고리의 다른 글
[프로그래머스 Level 1] 최소직사각형 (Python 파이썬) 풀이 방법 (0) | 2023.01.04 |
---|---|
[프로그래머스 Level 2] 멀리 뛰기 (Python 파이썬) 풀이 방법 (2) | 2023.01.04 |
[프로그래머스 Level 2] 다리를 지나는 트럭 (Python 파이썬) 풀이 방법 (2) | 2023.01.03 |
[프로그래머스 Level 2] 짝지어 제거하기 (Python 파이썬) 풀이 방법 (0) | 2023.01.03 |
[프로그래머스 Level 2] 다음 큰 숫자 (Python 파이썬) 풀이 방법 (0) | 2023.01.02 |