코딩테스트/백준 문제

[파이썬] 백준 10813번 : 공 바꾸기

김뚱입니다 2025. 4. 4. 06:22

[문제]

백준 10813번

 

 

 

[접근 방법]

바구니 개수 N

i번 바구니에 i번 공이 들어있음

공을 M번 교환하는데 i번 바구니와 j번 바구니에 들어있는 공을 서로 교환함

모든 교환이 끝난 뒤 1번 바구니부터 N번 바구니까지 들어있는 공의 번호를 순서대로 출력

 

일단 리스트 or 배열을 사용해서 푸는 문제임

저 바구니에 들어있는 공을 교환하는 건

basket[a], basket[b] = basket[b], basket[a]

이런 식으로 하면 될 듯

어렵지 않으니 바로 고고

 

 

 

[제출한 코드]

import sys

N, M = map(int, sys.stdin.readline().split())
basket = [0] * (N+1)

for i in range(1, N+1):
    basket[i] = i

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

print(*basket[1:])

설명하자면 일단 인덱스가 0부터 시작하는데 바구니 번호는 1부터 시작하니까

그걸 신경써주기 싫어서 0번 인덱스를 사용하지 않고 연산하는 방식으로 코딩했음

그래서 리스트의 크기도 N+1로 잡았음. 즉 인덱스 1 ~ N만 실제 값을 넣는다는 의미

이제 M번 교환하게 되는데a번 바구니와 b번 바구니를 서로 인덱스를 사용해서 swap 했음그리고 출력은 0번 인덱스를 제외하고 슬라이싱으로 1번부터 끝까지 출력되게 만들었음

 

 

 

[제출 결과]

 

 

 

[코드 수정]

내가 작성한 코드를 더 간결화시켜 봤다.

import sys

input = sys.stdin.readline

N, M = map(int, input().split())

basket = list(range(N+1))  # [0, 1, 2, 3, ..., N]

for _ in range(M):
    a, b = map(int, input().split())
    basket[a], basket[b] = basket[b], basket[a]

print(*basket[1:])

수정한 부분은 입력받는 부분을 간소화했고

basket[0]을 쓰지 않고 basket = list(range(N+1))로

basket[1] ~ basket[N]에 “1 ~ N”을 저장했음

 

 

[마무리]

백준 매일 한 문제는 풀고 싶은데 자기 전에 생각나서 풀었음!

단계별로 푸는 게 있는데 낮은 단계부터 푸는 중

어차피 100일 챌린지에 이것저것 하는데 백준도 100일 동안 1문제씩 풀어보면

실력이 늘지 않을까?