문제의 저작권은 SW Expert Acedemy에 있습니다.
문제접근
입력배열(board)을 차례로 순회하며 해당 인덱스에서 가능한 최대이동거리를 brute-force로 찾는다.
소스코드
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
"""
완전 탐색을 사용해 풀었습니다.
배열의 모든 x, y 좌표에서 얼만큼 이동이 가능한지 재귀적으로 탐색해서 구하고,
구한 값 중 가장 작은 값과 좌표를 출력합니다.
"""
import sys
sys.stdin = open("input.txt", "r")
def next_point(row, col, board):
""" 현재 좌표에서 이동 가능한 경로가 있는지 확인하고, 경로가 존재하면 경로의 좌표값을 반환한다. """
now = board[row][col]
length = len(board)-1
if row is not 0 and board[row-1][col] == now + 1:
return row-1, col
if row is not length and board[row+1][col] == now + 1:
return row+1, col
if col is not 0 and board[row][col-1] == now + 1:
return row, col-1
if col is not length and board[row][col+1] == now + 1:
return row, col+1
return -1, -1
def brute_force(row, col, board, move_cnt):
""" 현재 좌표에서 이동이 불가능할 때까지 재귀적으로 탐색한다. """
next_row, next_col = next_point(row, col, board)
if next_row == -1:
return move_cnt
return brute_force(next_row, next_col, board, move_cnt + 1)
def solution(N, board):
""" 2중 for 문을 순회하며 각각의 좌표값에서의 이동횟수를 모두 구하고, 가장 작은 값과 좌표를 반환한다. """
answer = 1
number = 1
for i in range(N):
for j in range(N):
move_cnt = brute_force(i, j, board, 1)
if answer < move_cnt:
answer = move_cnt
number = board[i][j]
elif answer == move_cnt:
number = min(number, board[i][j])
return number, answer
def main():
T = int(input())
for tc in range(1, T+1):
N = int(input())
board = [list(map(int, input().split())) for _ in range(N)]
number, answer = solution(N, board)
print(f'#{tc} {number} {answer}')
if __name__ == "__main__":
main()
|
cs |
'알고리즘 문제풀이' 카테고리의 다른 글
[백준 9935] 문자열 폭발 - python (0) | 2020.07.15 |
---|---|
[SWEA - 8189] 우편함 - c++ (0) | 2020.07.06 |
[SWEA - 1251] 하나로 - python (0) | 2020.07.06 |
[프로그래머스] 등굣길 - python (0) | 2020.07.06 |
[백준 9205] 맥주 마시면서 걸어가기 - c++ (0) | 2020.05.10 |