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

 

  1. 입력으로 주어진 x,y 즉 서로 바뀌어야 하는 값의 위치를 먼저 찾는다.
  2. 위의 그림으로 나타낸 두 수의 전환 알고리즘을 적용하여 값을 서로 바꿔준다.
  3. 값 변경이 완료되면 반복문을 종료한다. 이때 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. 너무 과몰입하면 산으로 가니까 문제를 풀다가도 한 템포 떨어져서 보기