개발 공부용

1220. [S/W 문제해결 기본] 5일차 - Magnetic 본문

코딩 테스트

1220. [S/W 문제해결 기본] 5일차 - Magnetic

솝제로 2025. 11. 13. 11:39

 

문제
 

SW Expert Academy

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

swexpertacademy.com

 

 

붉은 자성체는 S극에 이끌리고 푸른 자성체는 N극에 이끌린다.

만약 A, B로 표시된 자성체들과 같이, 이끌리는 극에 도달하기까지 다른 색의 자성체로 방해되지 않는다면 테이블 아래로 떨어진다.

그러나 C, D, F, E와 같이 다른 자성체와 충돌한 경우 교착상태에 빠져 움직이지 않게 된다.

발생한 교착상태의 개수를 구하시오.

 

 

입력
  • 10개의 테스트 케이스
  • 첫 줄: 정사각형 테이블 한 변의 길이(항상 100임)
  • 둘째 줄 ~ : 100x100 크기의 테이블 초기 모습(1은 N극 성질의 자성체, 2는 S극 성질의 자성체)
100
1 0 0 0 0 0 0 0 2 0 0 0 1 0 1 1 0 2 0 0 1 0 2 0 2 2 1 0 0 0 0 0 1 0 0 2 0 0 0 0 0 1 2 0 0 0 1 1...
0 0 0 0 0 0 0 0 0 0 1 0 0 2 0 0 0 0 0 2 0 0 1 0 0 0 0 0 1 2 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0...
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 2 2 0 2 0 0 0 0 0 1 0 0...
0 0 0 2 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 1 0 1 0 0 0 0 0 0 2 0 2 0...
0 0 0 0 2 0 2 0 0 0 2 0 0 0 0 0 0 2 1 1 0 2 0 0 0 1 2 2 2 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0...
0 0 2 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0...
...

 

출력
  • #테스트케이스번호 교착 상태의 개수
#1 471
#2 446

 

 

풀이
for i in range(1, 11):
    N = int(input().strip())
    table = [input().split() for _ in range(N)]
    deadlock = 0
    
    for col in range(N):
        one = False
        for row in range(N):
            if "1" == table[row][col]:
                one = True
            elif "2" == table[row][col] and one == True:
                deadlock += 1    
                one = False
                
    print(f"#{i} {deadlock}")

 

1은 N극 성질을 가지는 자성체, 2은 S극 성질을 가지는 자성체이다. 테이블 위에 N극, 아래에 S극이 있다.
따라서 1은 아래에 2이 없으면 제거되고, 있으면 교착 상태가 발생한다. <= 이 부분이 핵심

2은 위에 1이 없으면 제거되고, 있으면 교착 상태가 발생한다.

 

위에서부터 아래 방향으로 하나의 요소씩 입력받은 테이블을 읽을 때

1을 만난 뒤 2를 만나면 교착 상태가 발생한다.

따라서 1 만남 여부를 기록하고, 그 뒤에 2를 마주했을 때 교착 상태 횟수를 +1 한다.

카운팅 후에는 다시 1 만남 여부를 초기화한다.