파이썬 백준 10812번 문제 풀이
1. 문제 분석
이 문제를 처음 읽었을 때는 큐로 문제를 풀어나가야 하나 생각을 했다.
문제를 차분하게 살펴보니 큐를 사용하지 않고 간단하게 리스트 슬라이싱을
이용하면 풀 수 있다는 생각이 들어 리스트 슬라이싱 방법으로 문제에 접근했다.
begin, end, middle 이런식으로 i, j, k를 입력 받는다면
1. begin에서 middle - 1까지의 배열을 복사해서
2. end 뒤에 넣는다.
2. 코드
N, M = map(int, input().split()) # N과 M을 입력받는다
bag = list() # 바구니 리스트를 만들어준다
for i in range(1, N+1): # 바구니 리스트를 만들어준다
bag.append(i)
for x in range(M): # M만큼 반복한다
i, j, k = map(int, input().split()) # i, j, k를 입력받는다
shuffle = bag[i-1 : k-1] # j 앞까지 바구니 리스트를 슬라이싱 한다
for y in range(len(shuffle)): # 슬라이싱한 부분을 j 뒤로 붙혀준다
bag.insert(y+j, shuffle.pop(0))
del bag[i-1 : k-1] # 슬라이싱 한 부분을 제거한다
print(' '.join(map(str,bag)))
2.1 중요 코드 분석
shuffle = bag[i-1 : k-1] # j 앞까지 바구니 리스트를 슬라이싱 한다
begin에서 middle - 1까지의 내용을 shuffle라는 리스트에 저장한다.
for y in range(len(shuffle)): # 슬라이싱한 부분을 j 뒤로 붙혀준다
bag.insert(j+y, shuffle.pop(0))
슬라이싱 한 부분(shuffle)을 end 뒤로 붙혀준다.
for문을 이용해 하나씩 넣기 때문에 넣는 위치에 +1씩 해주어야한다.
del bag[i-1 : k-1] # 슬라이싱 한 부분을 제거한다
end 뒤에 슬라이싱 한 부분(shuffle)을 넣었기 때문에
앞에 슬라이싱 된 부분을 지워준다.
3. 총평
이 문제는 Solved.ac에서 난이도 브론즈 2로 매긴 문제이다.
난이도가 높은 편은 아니지만 문제 설명이 너무 난잡해서
이해하는게 제일 어려웠던 것 같다.
되도록이면 이중 for문을 사용하지 않고
bag.insert(y, shuffle)
이런식으로 접근 하였으나, 리스트 안에 리스트가 들어가게 됨으로
이중 for문을 사용하여 문제를 해결하게 되었다.
댓글남기기