[프로그래머스 알고리즘 스터디] 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