티스토리 뷰
백준 1966 번 프린터큐
항해 99 심화반은 파이썬으로 알고리즘을 풀어야 한다.
Javascript도 아직 신생아라고 생각하는데 갑자기 python으로 leekcode medium 급 문제를 풀게 되었다.
물론 나는 접근도 하지 못했고, 며칠을 풀이만 보고 하루에 한 문제만 완벽히 이해하도록 노력했다.
항해 99측에서는 파이썬이 알고리즘에 최적화된 언어라서 공통적으로 푼다고 하는데
' 이정도의 난이도를 제로베이스 상태에서 푸는게 맞는건가?' 라는 생각이 들었다.
결국 난 자바스크립트 위주로 알고리즘을 풀며 문법 공부를 추가로 하기로 결정했고, 하루 한 문제 정도는 자바스크립트, 파이썬으로 풀면서 코딩테스트에 왜 파이썬이 좋은지 스스로 깨닫는 과정을 밟고있다.
사고력을 특히 요하는 것 같은 이 문제를 풀지는 못했지만, 구글링을 통해 가장 좋은 풀이법을 가져오고 내 것으로 만들기 위해 노력했다.
문제의 길이는 길어 문제 자체를 이해하는데 시간이 걸렸다.
우리가 인쇄를 할 때 프린터에 우선순위를 정해두는 경우가 있다. 그럼 프린터기는 그 우선순위를 먼저 출력하게 된다.
그렇게 우선순위를 출력한 결과에서 이전에 testcases에서 case별로 정해진 문서(M)가 몇 번째로 인쇄되는지 출력하면 되는 문제였다.
문제 이해를 돕기 위해 표를 그려봤다.
case x 로 예를 들어보자. 궁금한 문서의 순서(index)가 4 이므로, 문서4가 인쇄가 몇 번째로 되는지 보면된다.
6개의 문서중 5개가 중요도가 1로 같지만, 인쇄순서(order)는 첫번째 값보다 중요도가 큰 값이 뒤에 하나라도 있으면 첫 번째 값을 queue의 맨뒤로 하나씩 넘기는 방식으로 진행된다는 점을 유의하자.
그럼 이제 문제를 풀려면 input값에서 각각 값을 변수로 지정해줘야한다.
나는 이 문제를 풀지 못했기에 이 부분부터는 좋은 개발자분의 풀이를 찾아서 그 순서대로 진행하였다.
# 1. testcases 로 입력을 받고, for 문을 돌려 n, m 과 문서의 중요도 queue 를 받는다.
for _ in range(testcases):
n, m = list(map(int, input().split()))
queue = deque(map(int, input().split()))
idx = deque(range(0, n))
# order 초기화
order = 0
while True:
# 1. 첫번째 if: queue 첫번째 값 = queue lists 최댓값?
if queue[0] == max(queue):
order += 1
# 두번째 if: idx의 첫 번째 값 = "target"?
if idx[0] == 'target':
print('order: ', order)
break
else:
queue.popleft()
idx.popleft()
# 2. idx의 첫번째 값이 target이 될 때까지 반복된다.
else:
queue.append(queue.popleft())
idx.append(idx.popleft())
같은 문제를 두 언어로 풀어보고 느끼는 건데
파이썬의 pop()과 append()는 정말 강력한 것 같다.
자바스크립트에서 pop(0)과 비슷한 기능을 하는 것이 shift()인데, shift()라는 메소드는 배열 자체를 움직이기 때문에 시간복잡도면에서 좋지 않다.
오늘도 알고리즘은 파이썬이 더 낫다는 것은 인정하게 되는 날이지만, 그래도 프론트엔드로서 자바스크립트로 알고리즘을 푸는 것은 멈추지 않을 것이다.
++ 추가로 CS study 팀원분 중 한분이 list가 아닌 deque로 두는게 시간복잡도 면에서 더 나을 거라는 말씀을 해주셨다.
오늘 강의에 나왔을텐데 오늘 강의 듣고 큐 구현해보라고해서 자바스크립트랑 파이썬 큐, 스택 다 구현해보다가 시간이 다 가서 강의 후반부는 모르는 상태였다.
어쨌든 말씀해 주신 부분이여서 deque의 역할을 찾아봤는데 진짜 좋은거네..
말해주신 팀원분께 감사하다하고싶은데 성함이 기억안난다. 코드는 수정완료!
Reference : https://assaeunji.github.io/python/2020-05-04-bj1966/
'알고리즘 > 백준-BACKJOON' 카테고리의 다른 글
[백준] 4673번- 자바스크립트(Javascript) | 콘솔 출력하면서 이해하는 백준 문제 풀이 (0) | 2022.02.11 |
---|---|
[백준] 4344번- 자바스크립트(Javascript, node.js) (0) | 2022.02.11 |
[백준] Javascript 백준 공부법 (0) | 2022.01.11 |
- Total
- Today
- Yesterday
- 프로그래머스 베스트앨범 자바스크립트
- GIT
- React Query
- 항해99
- 자바스크립트
- network
- cs50
- reactquery
- html
- 네트워크
- python
- 클로저
- 자바스크립트 비동기 처리
- 리액트
- 타입스크립트
- 실전프로젝트
- javascript
- 모두를 위한 컴퓨터 과학
- 리액트네이티브
- github
- 무한스크롤
- 백준
- css
- 자바스크립트알고리즘
- 알고리즘자바스크립트
- 프로그래머스
- React
- 모두를위한컴퓨터과학
- 자바스크립트 클로저
- 프로그래머스 자바스크립트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |