[프로그래머스 알고리즘 스터디] 2주차 - 빙고

YUZAMIN
Hello, World! I'm YUZAMIN, a diligently endeavoring frontend developer 🐤💦
[프로그래머스 알고리즘 스터디] 2주차 - 빙고

문제 설명 📑

빙고는 NxN 크기의 게임 보드 칸에 1부터 NxN까지의 자연수를 중복 없이 하나씩 적은 후 숫자를 하나씩 지워나가는 게임입니다. 이때, 가로, 세로, 대각선 방향으로 한 줄에 적힌 숫자를 모두 지울 경우 빙고를 1개 만들었다고 합니다. 다음은 4X4 크기의 게임 보드를 이용해 게임을 진행한 예시입니다.

위와 같이 각 칸에 숫자가 적혀 있을 때, 위 게임 보드에서 순서대로 지운 숫자가 [14,3,2,4,13,1,16,11,5,15]인 경우 아래와 같이 빙고 3개가 만들어집니다.

빙고 게임 보드에 적힌 숫자가 담겨있는 배열 board, 게임 보드에서 순서대로 지운 숫자가 들어있는 배열 nums가 매개변수로 주어질 때, board에서 nums에 들어있는 숫자를 모두 지우면 몇 개의 빙고가 만들어지는지 return하도록 solution함수를 완성해주세요.

제한사항 🚫

s의 길이는 1 이상 1,000 이하입니다. s는 알파벳 소문자로만 이루어져 있습니다.

문제 풀이 👩🏻‍💻

리뷰 반영 전

리뷰 반영 후

  • answer에 값을 추가하는 과정을 list comprehension을 통해 진행

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 빙고
def solution(board, nums):
    answer = 0

    # 체크할 번호들을 set으로 생성
    numbers = set(nums)
    board_size = len(board)

    # 보드의 크기만큼 0으로 채워진 배열 2개 생성
    # 배열 내 요소들은 각각 해당 인덱스의 행, 열별로 체크된 칸의 개수를 나타냄
    # ex. row_line[2] = 3 이면 3번 째 행의 체크된 칸의 개수가 총 3개
    row_line = [0] * board_size
    column_line = [0] * board_size

    # 두 개의 대각선 내에 위치한 칸에 대한 개수 체크
    right_diagonal_line = 0
    left_diagonal_line = 0

    for row in range(board_size):
        for column in range(board_size):
            # 만약 해당 칸의 숫자가 numbers 내에 존재하면
            if board[row][column] in numbers:
                # 행과 열 배열(row_line, column_line) 내 해당 칸의 행과 열에 해당하는 인덱스의 값을 1 더함
                row_line[row] += 1
                column_line[column] += 1

                # 만약 해당 칸의 행과 열 숫자가 같으면 좌측 하단을 향한 대각선 내의 칸이므로
                # right_diagonal_line에 1을 더함
                if row == column:
                    right_diagonal_line += 1

                # 해당 칸의 행과 열 숫자의 합이 board_size - 1인 경우
                # 우측 하단을 향한 대각선 내의 칸이므로 left_diagonal_line에 1을 더함
                if row + column == board_size - 1:
                    left_diagonal_line += 1

    # 대각선 변수를 board_size로 나눈 나머지(각각 0 또는 1)를 answer에 더함
    answer = right_diagonal_line // board_size + left_diagonal_line // board_size

    # 행과 열 배열(row_line, column_line)의 요소를 각각 순회하며 해당 요소가 board_sized이면
    # 해당 행 또는 열 내의 모든 칸들이 체크되었다는 뜻이므로 answer 변수에 1씩 더함
    answer += sum([1 for i in range(board_size) if row_line[i] == board_size])
    answer += sum([1 for i in range(board_size)
                  if column_line[i] == board_size])
    return answer

문제 출처