https://programmers.co.kr/learn/courses/30/lessons/42587
문제가 중간에 짤려 추가설명을 하면
맨 앞단의 것을 기준으로
그보다 더 우선순위가 높은 게
뒤에 있다면
맨 앞에 있는 걸 뒤로 보내버립니다.
2번째 예제의 경우
1,1,9,1,1,1에서
1보다 9가 더 크기 때문에
1,9,1,1,1,1이 되고
여기서 맨 앞의 1보다 9가 크기 떄문에
9,1,1,1,1,1이 됩니다.
이제 9 뒤에 9보다 큰 게 없으니
9가 인쇄가 됩니다.
이 문제는 인쇄순서를 짜는 건
큐의 사용방법을 생각하면
쉽게 파악이 되었습니다.
문제는 인쇄순서를 return하는 것.
맨 처음 배열에서
location이 가리키는 위치에 있는 게
대체 몇 번째에 나오냐
처음에는 딕셔너리를 활용할 생각을 하다가
키(key)를 바꾸는 방법이 잘 안 찾아서
포기하고 리스트 상태에서
어떻게하면 해결할지 고민을 했습니다.
'그러면 location에 있던 숫자를 받고
그 숫자가 언제 출력되는지 구하면 되겠네?'
라고 생각해보니
2번째 예제에서 바로 걸렸습니다.
2번째 예제에서는 5로 출력이 되어야하는데
저렇게 1이 중복되어서 나올 경우엔
1이 가장 먼저 출력되는 경우를 구해보니
2가 출력이 되었습니다.
그렇다면 어떻게할까...
저는 먼저
현재 위치를 now_on으로 받았습니다.
이건 예제2를 기준으로 작성을 했는데요.
먼저, 처음엔 location이 0이라
now_on도 0입니다.
현재는 now_on이 맨 앞이지만
우선순위가 있는 것이 있어
맨 뒤로 보내고
now_on도 맨 뒤의 순서값인
5로 대입해줍니다.
그 다음, 다른 것이 뒤로 오게 되면
now_on에 있는 숫자값이 한자리 증가하므로
now_on에 1을 빼줍니다.(순번이 감소)
그리고 앞에서 pop을 해줄수록
계속 순번이 가까워지니
또 1을 빼줍니다.
그러다가, 마침내 맨 앞에 오게 되면
몇번째로 pop이 되었는지(인쇄되었는지)
리턴해줍니다.
def solution(priorities, location):
#answer = location-1
now_on=location
poping=1 #인쇄순번 알려줌
while priorities:
now=priorities[0] #현재 맨 앞의 값을 기준으로 비교
back=0
for x in priorities:
if now<x: #뒤에 우선순위가 더 높은 것이 있을 경우
priorities.pop(0)
priorities.append(now)
back=1 #뒤로 보낸다
if now_on==0:#만약 now_on이 맨 앞일 경우
now_on=len(priorities)-1
else:#맨 앞이 아닐 경우
now_on-=1
break
if back==0:#뒤로 보내지 않았을 경우
if now_on==0:
return poping#찾고자하는 것이 맨 앞이면 몇 번째 인쇄인지 출력
else:#그게 아니라면, 맨 앞에껄 pop(인쇄)해주고 순번을 앞당김
priorities.pop(0)
now_on-=1
poping+=1
큐에 대한 공부와 더불어서
어떻게 순번을 고를지 생각할 수 있게 만들어주었던 문제였습니다.
[백준 14888번] 연산자 끼워넣기 (0) | 2022.03.06 |
---|---|
[프로그래머스]삼각달팽이(파이썬) (0) | 2022.03.04 |
[백준 15685번] 드래곤 커브 (1) | 2022.02.28 |
[백준 23288번] 주사위 굴리기2(파이썬) (0) | 2022.02.23 |
[백준14503번]로봇청소기(파이썬) (0) | 2022.02.21 |
댓글 영역