Stay Hungry Stay Foolish

SWEA

[SWEA] 1220. [S/W 문제해결 기본] 5일차 - Magnetic (Python/D3)

dev스카이 2024. 10. 21. 19:02

[문제 링크] 👇

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 


 

풀이

테이블 위는 N극, 아래는 S극이고 입력에서의 1은 N극, 2는 S극이다. 

N극 쪽에는 1이 있으면 안 되고, S극 쪽에는 2가 있으면 안 된다.

 

 

 

위 그림과 같이 1 다음에 2 가 있으면 교착상태라는 것이다. 한 줄씩 확인하면서 1과 2가 같이 나타나는 개수를 세어주면 된다.

 

현재 bit를 1이라고 정하고 시작한다.

for i in range(100):
    bit = 1

 

이제 한 줄씩 확인한다. 

    for j in range(100):
        if table[j][i] == 1:
            bit = 2
        elif table[j][i] == bit:
            bit = 1
            result += 1
  • 현재 자성체가 1이면 bit를 2로 바꾼다. 
  • 현재 자성체가 현재 비트와 같으면, 즉 현재 비트가 2이면 bit를 1로 변경하고 결과값을 증가한다.
  • if table[j][i] == 1:
    • N극(1)을 만나면 bit를 2로 변경한다. 이제 다음에 나오는 S극(2)과의 충돌을 감지할 준비가 된 것이다.
  • elif table[j][i] == bit:
    • 이 조건은 bit가 2일 때, S극(2)을 만났는지를 확인한다. 즉, N극을 만난 이후에 S극을 만나면 교착 상태가 발생한 것이다.
    • result 값을 증가시키고 bit를 다시 1로 설정하여 새로운 교착 상태를 찾을 준비를 한다.

 

 

💡왜 조건문에서 elif table[j][i] == 2: 라고 하면 안 되는가?

1 다음에 2 인 것을 확인해야 교착상태인 것을 알게 되는데, 이 조건문은 bit가 1일 때도 S극을 만나게 되며 교착 상태를 잘못 판단할 수 있다.

  • 예를 들어, N극(1)을 만나지 않고 바로 S극(2)이 나왔을 때도 이 조건이 참이 되어 result 값이 증가하게 된다.

 

Solution

for tc in range(1, 11):
    length = int(input())
    table = [list(map(int, input().split())) for _ in range(100)]
    result = 0
    for i in range(100):
        bit = 1
        for j in range(100):
            if table[j][i] == 1:
                bit = 2
            elif table[j][i] == bit:
                bit = 1
                result += 1
    print("#%d %s" % (tc, result))

 

 

👩‍💻 회고

어떻게 풀어야 할지 막막했는데, 풀이 안 보고 푼 나에게 박수를.. 1289. 원재의 메모리 복구하기에서 착안을 얻어 풀었다. 그 문제를 미리 풀어서 다행이었다.