[ SWEA 2105 ] 디저트 카페 (파이썬)
SW Expert Academy : 문제 풀러 가기
1. 문제 요약
알고리즘 분류 | 완전 탐색
디저트 카페를 대각선 방향으로 순회후 원점으로 돌아올때 서로 다른 종류의 디저트를 최대 몇 종류 먹을 수 있는지 알아내라.
2. 접근 방식
- 보드 안에서 대각선 모양의 직사각형을 모두 찾습니다.
- 대각선-직사각형을 구성하는 선분의 길이의 비율을 조합으로 구해서 계산합니다. (ex| 23, 22, 2*1)
- 경로중에 중복이 없다면, 사각형의 디저트 종류를 세어서 저장합시다..
- PROFIT
풀이 >
from itertools import combinations_with_replacement as cb
# delta값 설정
delta = ((1, 1), (-1, 1), (-1, -1), (1, -1))
def dfs(s, size, sweets):
global answer
x, y = s
for edge in range(4):
dx, dy = delta[edge]
if edge % 2 == 0:
for _ in range(size[0]-1):
x, y = x + dx, y + dy
if x < 0 or y < 0 or x > N-1 or y > N-1:
return
if board[x][y] in sweets:
return
sweets.add(board[x][y])
else:
for _ in range(size[1]-1):
x, y = x + dx, y + dy
if x < 0 or y < 0 or x > N-1 or y > N-1:
return
if board[x][y] in sweets:
return
sweets.add(board[x][y])
cnt = len(sweets)
if cnt > answer:
answer = cnt
T = int(input())
for tc in range(1, T+1):
N = int(input())
board = [list(map(int, input().split())) for _ in range(N)]
sizes = list(cb(range(2, N), 2))
sizes.pop()
for i in range(len(sizes)-1, -1, -1):
one, two = sizes[i]
if one != two:
sizes.append((two, one))
sizes.sort(reverse=True)
answer = -1
for i in range(N):
for j in range(N):
for size in sizes:
dfs((i, j), size, set())
print('#{} {}'.format(tc, answer))
3. 감상
- 직관적으로 풀었는데 제한시간이 넉넉해서 통과할 수 있었습니다.
- 제가 푼 방식은 매우 비효율적입니다!
- 문제의 핵심은
2차원 배열을 대각선으로 순회할 수 있는가
라는 부분입니다.
공유하기!