article thumbnail image
Published 2022. 8. 25. 22:30

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14hwZqABsCFAYD

 

SW Expert Academy

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

swexpertacademy.com

 


아이디어

  1. 1은 밑으로 내려가고, 2는 위로 올라온다.
  2. 교착상태인 자석 형태(1, 2가 붙은 상황)의 개수를 세야 한다.
  3. 현재 상태를 알려주는 flag라는 변수를 만든다.
  4. flag는 교착상태를 알려주는 변수로 사용되며 교착 자석의 수(출력 값)를 더해주는 정보를 준다.
  5. 열 우선 순회로 0, 2를 먼저 만나면 무시하고 1을 만나면 flag를 1로 변경한다. (초기 flag == 0)
  6. flag가 1인 상태로 2를 만나면 교착 자석이 하나 있다는 뜻으로 cnt에 1을 더해주고 flag는 2로 변경
  7. flag가 2인 상태로 0을 만나면 flag를 0으로 변경해준다.
  8. 추가 설명은 코드의 주석에 있으며 직접 노트에 적어보며 이해해보길 추천.

풀이

for tc in range(1, 11):
    N = int(input())
    magnetic = [list(map(int, input().split())) for _ in range(N)]

    cnt = 0
    for j in range(N):
        flag = 0
        for i in range(N):
            if magnetic[i][j] == 1:         # 열 우선 순회 하다가 1을 만나고
                if flag == 0 or flag == 2:  # flag가 0이나 2이면
                    flag = 1                # flag를 1로 바꿔줌
            elif magnetic[i][j] == 2:       # 그러고 2를 만나고
                if flag == 1:               # flag가 1이면
                    flag = 2                # flag를 2로 바꿔주고
                    cnt += 1                # cnt를 1증가, 교착 상태인 자석
            else:                           # 요소가 0일 떄
                if flag == 2:               # flag가 2라면
                    flag = 0                # flag를 0으로 바꿔줌
    print(f'#{tc}', cnt)
복사했습니다!