백준 2210. 숫자판 점프
주어진 격자판을 상하좌우로 이동하여 만들어 낼 수 있는 6자리의 수들 중
중복되지 않은 수들의 갯수를 반환하는 프로그램을 짜시오.
문제 조건
숫자판의 모든 지점에서 수를 만들어 낼 수 있다.
만들어진 6자리의 수는 서로 중복되지 않아야 한다.
문제 풀이
이 문제는 이해하기 쉽도록 재귀로 풀 수 있다. 주어진 입력값의 크기는 2차원 배열 5*5이므로 재귀로 풀어도 stackoverflow 에러가 나지 않기 때문에 해당 방법으로 문제를 풀었다. 문자의 길이가 6이 아니면 count를 더해 재귀한다. 현재의 문자의 길이가 6이 될때에 만들어진 수를 집합(set()) 컨테이너에 넣어서 중복을 제거해준다. board의 모든 지점에서 문자열을 만들어 집합에 넣어주었을 때, 해당 집합의 길이를 출력해주면 된다.
파이썬 코드
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
|
import sys
input = sys.stdin.readline
def checkNumber(board, pos, unique_numbers, current_number, count):
rd = [-1, 0, 1, 0]
cd = [0, 1, 0, -1]
r, c = pos
for i in range(4):
temp_r = r + rd[i]
temp_c = c + cd[i]
if 0 <= temp_r < 5 and 0 <= temp_c < 5:
next_number = current_number + str(board[temp_r][temp_c])
if count == 5:
unique_numbers.add(next_number)
else:
checkNumber(board, (temp_r, temp_c), unique_numbers, next_number, count + 1)
def solve(board):
unique_numbers = set()
for i in range(5*5):
r = i // 5
c = i % 5
checkNumber(board, (r,c), unique_numbers, str(board[r][c]), 1)
total_unique_count = len(unique_numbers)
print(total_unique_count)
if __name__ == "__main__":
lines = []
for i in range(5):
lines.append(input().strip().split())
solve(lines)
|
cs |
'온라인 코딩 테스트 문제 풀이 > 백준 문제 풀이' 카테고리의 다른 글
Python으로 푸는 백준 10799. 쇠막대기 (0) | 2019.05.05 |
---|---|
Python으로 푸는 백준 2309. 일곱 난쟁이 (0) | 2019.05.01 |
Python으로 푸는 백준 9012. 괄호 (0) | 2019.04.17 |
Python으로 푸는 백준 3184. 양 (0) | 2019.04.12 |