백준 10811번

도덩이의 개발 일지·2023년 6월 26일

백준

목록 보기
29/131
post-thumbnail

안녕하세요 :)
오늘은 백준 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가지 방법이 있습니다.

  1. ' = ' 를 사용해서 리스트를 복사하는 방법
  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=" ")
profile
말하는 감자에서 개발자로 ( ´͈ ᵕ `͈ )◞♡

0개의 댓글