코테 준비

[프로그래머스] 빙고

우디혜 2020. 9. 12. 01:28

로직

  • 딕셔너리를 사용해서 { num : board상의 idx } 정보들을 다 저장

  • N 사이즈의 rows, cols 리스트를 만들어서 각 행과 열에 몇 개의 num이 등장했는지 카운트

  • 대각선은

    • (1) 현재 위치한 행 == 열 인 경우 카운트 --- [왼쪽 위에서 오른쪽 아래로 향하는 대각선]

    • (2) 현재 위치한 행 + 열 + 1 == N 인 경우 카운트 --- [반대 대각선]

  • rows와 cols는 순회하면서 카운트가 N일시 빙고 +1, diag_RL와 diag_LR은 값이 N일시에 빙고 +1

 

코드

def solution(board, nums):
    answer = 0
    N = len(board)
    num_location = {}
    rows, cols, diag_LR, diag_RL = [0]*N, [0]*N, 0, 0
    idx = 0
    
    # 1. num_location에 data와 data의 index 정보를 저장
    # O(N*N)
    for x in range(N):
        for y in range(N):
            data = board[x][y]
            num_location.setdefault(data, idx)
            idx+=1
            
    # 2. 각 row, column에 몇 개의 숫자가 지워졌는지 카운트
    #    두 개의 diagonal도 마찬가지로 column을 기준으로 잡았을 때,
    #    2-1. r == c 인 num이 있으면 카운트
    #    2-2. r + c == N-1 인 num이 있으면 카운트
    # O(N)
    for num in nums:
        idx = num_location[num]
        
        # row, col 확인
        r, c = (idx//N) , idx%N
        rows[r] +=1
        cols[c] +=1
        
        # diagonal 확인
        if r == c: diag_LR += 1
        if r + c == N-1: diag_RL += 1
    
    
    # rows, columns은 N번 카운트 된 부분이 있으면 빙고 +1
    # diagonal은 N일 경우 빙고+1
    
    for r in rows:
        if r == N: answer +=1
    for c in cols:
        if c == N: answer +=1
    if diag_LR == N: answer +=1
    if diag_RL == N: answer +=1
        
    return answer