백준 10813번 풀이

문제

바구니에 있는 공을 서로 바꿀건데 최종적으로 그래서 몇번 공이 들어가있는가? (리스트 스왑)

Reference

https://hi-datalab.tistory.com/63

풀이

바구니에 공 넣는거랑 비슷한 문제다. 대신 이번에는 바구니에 공이 이미 ‘들어있기’때문에 배열을 만드는 방식이 좀 다르다.

import sys 
N, M = map(int,sys.stdin.readline().split())
basket = list(range(N))
for i in basket:
    basket[i] = 0
# 리스트를 0으로 채운다

10810번 문제는 바구니에 공을 넣는것이기때문에 빈 바구니로 시작해서 배열 안에 다 0이 들어가 있게 된다.

import sys 
N, M = map(int,sys.stdin.readline().split())
basket = list(range(N))
for i in basket:
    basket[i] = 0
# 리스트를 0으로 채운다

근데 또 이렇게 하면 1번 바구니에 0번 공이 들어가는 사상 초유의 사태가 벌어진다 이말이오.

import sys 
N, M = map(int,sys.stdin.readline().split())
basket = list(range(1,N+1))

그래서 이렇게 해줘야 바구니와 같은 번호의 공이 들어가게 된다. 가릿?

for i in range(M): 
    x,y = map(int, sys.stdin.readline().split())

그 다음 어떤 바구니의 공을 맞바꿀건지 입력을 받게 된다. 여기까지는 쉽죠?

for i in range(M): 
    x,y = map(int, sys.stdin.readline().split())
    basket[x], basket[y] = basket[y], basket[x]

파이썬은 이렇게만 하면 리스트 스왑이 된다. 되는데 문제가 있어요. 저거 저렇게 하고 예시 문제 입력하면 1번 바구니 빼고 공을 바꾸게 되는 사상 초유의 사태가 일어난다. 왜? 컴퓨터 입장에서는 0번 바구니부터거든.

for i in range(M): 
    x,y = map(int, sys.stdin.readline().split())
    basket[x-1], basket[y-1] = basket[y-1], basket[x-1]

그래서 이렇게 인덱스 번호를 입력값에서 하나씩 빼줘야 한다.

import sys 
N, M = map(int,sys.stdin.readline().split())
basket = list(range(1,N+1))

for i in range(M): 
    x,y = map(int, sys.stdin.readline().split())
    basket[x-1], basket[y-1] = basket[y-1], basket[x-1]

print(*basket)

가릿?