
안녕하세요 :)
오늘은 백준 10811번 문제를 들고 왔습니다.
이 문제는 입력받은 범위의 바구니들을 역순으로 바꾸는 문제였는데요 ! 저도 역순을 바꾸는 걸 어떻게 구현할까 생각을 많이 하느라 시간이 좀 걸렸습니다 ㅎㅎ
이 문제의 핵심은 입력받은 수가 a, b라고 했을 때 해당하는 리스트의 범위를 역순으로 표현하는 것과 리스트를 복사하는 방법입니다.
저는 2개의 배열을 사용해서 역순을 구현했습니다. 입력받은 수가 a, b라고 했을 때, a-1 ~ b-1까지 반복을 돌리면서 한 리스트에서 다른 리스트로 값을 옮기고 반복이 끝났을 때 그 리스틀를 다른 리스트에 업데이트하는 방법을 사용했습니다.
a, b = map(int, sys.stdin.readline().split()) index = b-1 if(a != b): for x in range(a-1, b): arr[index] = l[x] index -= 1 l = arr.copy()
파이썬에서 리스트를 복사하는 방법은 대표적으로 2가지 방법이 있습니다.
- ' = ' 를 사용해서 리스트를 복사하는 방법
- copy()를 사용해서 리스트를 복사하는 방법
첫 번째 방법과 두 번째 방법은 차이점을 가지고 있습니다.
' = ' 를 사용해서 리스트를 복사하게 되면 두 리스트가 같은 주소값을 가지게 되어서 둘 중 하나의 리스트 요소가 변경되게 되면 다른 리스트 또한 똑같이 값이 변경되게 됩니다.
반면, copy()를 사용해서 리스트를 복사하게 되면 각각 개별적인 주소값을 가져 둘 중 하나의 리스트 요소가 변경되어도 다른 리스트에 영향을 주지 않습니다.
제가 처음에 이것을 생각을 못하고 ' = ' 를 사용해서 구현했는데 자꾸 값이 이상해져서 혹시...? 했는데 역시였습니다 ㅋㅋㅋ 다들 조건에 맞춰서 잘 사용하시길 바라겠습니다 ദ്ദി˶˙ᵕ˙˶ )
다음은 10811번 정답 코드입니다.
import sys
n, m = map(int, sys.stdin.readline().split())
l=[]
arr=[]
for x in range(0, n):
l.append(x+1)
arr.append(x+1)
for x in range(0, m):
a, b = map(int, sys.stdin.readline().split())
index = b-1
if(a != b):
for x in range(a-1, b):
arr[index] = l[x]
index -= 1
l = arr.copy()
for x in l:
print(x, end=" ")