문제
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다.
도현이는 앞으로 M번 공을 바꾸려고 한다. 도현이는 공을 바꿀 바구니 2개를 선택하고, 두 바구니에 들어있는 공을 서로 교환한다.
공을 어떻게 바꿀지가 주어졌을 때, M번 공을 바꾼 이후에 각 바구니에 어떤 공이 들어있는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와 j번 바구니에 들어있는 공을 교환한다는 뜻이다. (1 ≤ i ≤ j ≤ N)
도현이는 입력으로 주어진 순서대로 공을 교환한다.
출력
1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.
import sys
n, m = map(int, sys.stdin.readline().split())
basket = [x for x in range(1, n+1)]
for _ in range(m):
i, j = map(int, sys.stdin.readline().split())
t = basket[i-1]
basket[i-1] = basket[j-1]
basket[j-1] = t
for y in basket:
print(y, sep=' ')
코드 풀이
10810 공 넣기에서 조건이 조금 바뀐 문제다. 슈도 코드는 다음과 같다.
바구니 갯수와 공을 바꿀 횟수를 입력받는다
바구니 번호(=공 번호의 초기값)을 변수에 저장한다
공을 교환할 바구니 번호 두 개를 입력받는다
두 바구니의 번호를 교환한다
-> 첫 번째 바구니의 번호를 새로운 변수에 할당한다
첫 번째 바구니 번호를 두 번째 바구니 번호로 대체한다
두 번째 바구니에 변수에 저장해둔 첫 번째 바구니 번호로 대체한다
위의 교환 과정을 공을 바꿀 횟수만큼 반복한다
바뀐 바구니 번호 리스트를 공백으로 구분해 리턴한다
sys.stidin.readline()으로 입력받은 값을 .split() 메서드로 분할하고 그 값들에 map 함수를 사용해 int 타입으로 변환한다. 그 값을 n과 m이라는 변수에 할당한다. 바구니 갯수와 같은 길이의 바구니 번호(공 번호의 초기값)을 생성하기 위해 1부터 n+1까지의 수를 for문으로 반복해서 생성한다. 그 수를 basket이라는 리스트 형태의 새로운 변수에 저장한다. basket을 리스트 형식의 변수로 선언하고 for문에서 하나씩 입력받아 리스트에 더할 수도 있다.
다음은 두 바구니 번호를 교환하는 부분인데, 처음에는 이 부분에서 두 바구니 번호를 동시에 교환하는 코드를 작성했다.
>>> basket[i-1], basket[j-1] = basket[j-1], basket[i-1]
알고리즘 수업에서 이건 파이썬에서만 작동하는 코드임을 알게 되었다. 다른 언어에서는 하나씩 값을 비우고 변경할 수 있다기에, t라는 변수에 basket[i-1] 를 저장하고 값을 차례로 바꾸는 코드로 수정했다. i가 아닌 i-1을 인덱스로 사용한 이유는 리스트 인덱스가 0부터 시작하지만 문제의 바구니 번호는 1부터 시작하기 때문이다.
마지막으로 반복문을 통해 basket 리스트 안의 인자를 하나씩 꺼내고 공백으로 구분해 출력했다.
처음으로 슈도코드를 작성해봤는데 문제를 이해하기에도 좋고 무작정 코드부터 쓰기 시작할 때보다 파이썬 문법에 대해 더 고민해볼 수 있었다. 어떤 함수를 왜 사용해야 하는지, 사용할 수 있는지, 사용할 수 없는지. 백준 문제들을 풀면서 코딩 테스트가 진짜 프로그래밍에 도움이 되는지, 시험을 위한 시험이 아닌지 의구심이 들었다. 물론 내가 못해서 부정적이었던 것도 맞다. 문제를 두고 고민하던 시간이 점점 쌓이면서 그 동안 함수나 조건문을 제대로 이해하지 않은 채 감으로 때려맞추며 써왔다는 걸 깨달았다.
DBSC 수업을 들으면서 멋사 수업을 들을 때와는 다르게 혼자 공부하는 시간이 늘었다. 빨리 취업을 하고 싶다는 마음이 커졌고 혼자서 하지 않으면 안 되겠다는 절박함이 생겼다. 스터디처럼 같이 공부하면 더 좋겠지만 아직까지는 만족한다.
'코딩 테스트' 카테고리의 다른 글
백준 5597 과제 안 내신 분..? 3052 나머지 파이썬 배열 풀이 (0) | 2024.04.15 |
---|---|
백준 10810 공 넣기 파이썬 배열 풀이 (0) | 2024.04.04 |
백준 2750 파이썬 정렬 풀이 (0) | 2024.04.02 |
백준 10818, 2562 파이썬 1차원 배열 풀이 (0) | 2024.04.01 |
백준 10807, 10871 파이썬 1차원 배열 풀이 (0) | 2024.03.28 |