Algorithm/Stack & Queue

[Python] SWEA 1220번 Magnetic

코딩쪼앙 2023. 5. 12. 14:22

문제

 

SW Expert Academy

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

swexpertacademy.com

나의 풀이

  • 위에 있는 자석이 1, 아래에 있는 자석이 2이므로 열이 아닌 행을 기준으로 탐색하면서 다른 극을 만나면 교착상태에 빠지는 횟수를 카운트 해준다.
  • 위에있는 자석이 N극이므로, 제일 위에 있는 행에 S극이 있다면, 테이블 밖으로 떨어질 것이므로, 행을 탐색할 때 처음 값이  N극인 경우를 탐색해야한다.
  • N극인 경우 flag값을 1로 바꾼 후, 같은 열의 다른  행에서 S극을 만났다면 교착상태로 카운트 하고, flag를 다시 0으로 바꿔준다.
  • 위 과정을 반복한 후, 출력형식에 맞게 교착상태로 카운트 된 횟수를 출력한다. 

코드

for tc in range(10):
    n = int(input())
    board = [list(map(int,input().split())) for _ in range(n)]

    # N극 : 1, S극 : 2 , 맨 윗칸 N극, 맨 아랫칸 S극
    result = 0
    for i in range(n):
        flag = 0
        for j in range(n):
            if board[j][i] == 1:
                flag = 1
            elif board[j][i] == 2:
                if flag:
                    result += 1
                    flag = 0
                    
    print(f'#{tc + 1}', result)

다른 사람의 풀이

  • flag로 처리한 위 과정을 stack으로 처리하였다.
  • 행을 기준으로 탐색하면서 stack이 비어있는 상태(N극이 들어있지 않은 상태)에서 N극을 만나면 stack에 1을 넣고, S극을 만날 때 stack의 값을 뺴서 교착상태로 카운트 한다.
  • 출력 형식에 맞춰 출력한다.

풀이 과정 참고해서 짠 코드

for tc in range(10):
    n = int(input())
    board = [list(map(int,input().split())) for _ in range(n)]

    # N극 : 1, S극 : 2 , 맨 윗칸 N극, 맨 아랫칸 S극
    result = 0
    for i in range(n):
        stack = []
        for j in range(n):
            # 이미 1이 들어있는 경우 거르고 스택에 넣기
            if not stack and board[j][i] == 1:
                stack.append(1)
            # 스택에 1이 들어있는 경우 pop하고, 1더하기
            elif stack and board[j][i] == 2:
                result += stack.pop()
    print(f'#{tc + 1}', result)