코딩테스트/백준 문제
[파이썬] 백준 10813번 : 공 바꾸기
김뚱입니다
2025. 4. 4. 06:22
[문제]
[접근 방법]
바구니 개수 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문제씩 풀어보면
실력이 늘지 않을까?