PS/BOJ&Programmers
[백준/1547] 공 | 두 수의 전환
sebinChu
2024. 7. 5. 01:03
공
알고리즘
알고리즘을 공부해본 사람이라면 한 번쯤은 겪었을 법한 두 수의 전환을 이용한다.
이 문제에서 주의해야 할 점은 공의 번호와 인덱스를 달리 생각해야 한다는 것이다. 예를 들어, 1번 공과 3번 공의 위치를 바꿀 때 배열의 인덱스는 그대로고 1번 공과 3번 공의 위치만 즉, 인덱스 번호 바뀌는 것이다.
그래서 인덱스로만 다룰 순 없고 for문으로 공의 번호가 저장된 배열을 돌면서 입력으로 주어지는 x,y의 위치를 찾아야 한다.
for _ in range(m):
x,y=map(int,input().split())
# x 위치 먼저 찾기
for i in range(len(arr)):
if arr[i]==x:
# x가 있는 위치의 값을 tmp_x 변수에 저장해 둠.
tmp_x=arr[i]
# 이후 y의 위치 찾기
for j in range(len(arr)):
# x,y가 있는 위치의 값을 서로 reverse. 이때, tmp_x 변수에 저장해둔 값 사용
if arr[j]==y:
arr[i]=arr[j]
arr[j]=tmp_x
flag=True
break
# x,y의 위치 찾기가 끝났다면 루프를 종료
if flag:break
- 입력으로 주어진 x,y 즉 서로 바뀌어야 하는 값의 위치를 먼저 찾는다.
- 위의 그림으로 나타낸 두 수의 전환 알고리즘을 적용하여 값을 서로 바꿔준다.
- 값 변경이 완료되면 반복문을 종료한다. 이때 flag를 사용해서 바깥 반복문도 종료해준다.
전체코드
import sys;input=sys.stdin.readline
m=int(input())
arr=[0,1,2,3]
tmp_x=0
flag=False
for _ in range(m):
x,y=map(int,input().split())
# x 위치 먼저 찾기
for i in range(len(arr)):
if arr[i]==x:
# x가 있는 위치의 값을 tmp_x 변수에 저장해 둠.
tmp_x=arr[i]
# 이후 y의 위치 찾기
for j in range(len(arr)):
# x,y가 있는 위치의 값을 서로 reverse. 이때, tmp_x 변수에 저장해둔 값 사용
if arr[j]==y:
arr[i]=arr[j]
arr[j]=tmp_x
flag=True
break
# x,y의 위치 찾기가 끝났다면 루프를 종료
if flag:break
print(arr[1])
알게된 점
어려운 문제는 아닌데 예상보다 시간이 걸렸다. 이유는 문제를 풀면서 "어 이 간단한게 왜 안되지?"라는 생각에 사로잡혔기 때문. 즉시 객관화를 하고 천천히 시도해서 다행히 잘 풀었다
이 문제를 풀면서 느낀/앞으로도 유지해야 할 좋은 태도!
1. 큰 문제를 작은 문제 단위로 나누어서 생각
- 예를 들어, 이 문제에서 두수의 전환이라는 큰 흐름은 잘 잡았었다. 그런데 미세한 부분(값의 위치를 찾는다, 변경은 ~지점에서 한다.) 이런 걸 놓쳤다. 하나씩 1,2,3... #1, #2, #3... 이런식으로 작은 단위로 나누고 차차 풀어나가는 태도를 갖자.
2. 내가 생각한 게 코드로 이어지지 않을 수 있다는 객관화
3. 너무 과몰입하면 산으로 가니까 문제를 풀다가도 한 템포 떨어져서 보기