[ SWEA 2105 ] 디저트 카페 (파이썬)

December 09, 2019에 게시됨.

 

SW Expert Academy : 문제 풀러 가기

 

1. 문제 요약

알고리즘 분류 | 완전 탐색

img

디저트 카페를 대각선 방향으로 순회후 원점으로 돌아올때 서로 다른 종류의 디저트를 최대 몇 종류 먹을 수 있는지 알아내라.

2. 접근 방식

  1. 보드 안에서 대각선 모양의 직사각형을 모두 찾습니다.
  2. 대각선-직사각형을 구성하는 선분의 길이의 비율을 조합으로 구해서 계산합니다. (ex| 23, 22, 2*1)
  3. 경로중에 중복이 없다면, 사각형의 디저트 종류를 세어서 저장합시다..
  4. 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차원 배열을 대각선으로 순회할 수 있는가 라는 부분입니다.

공유하기!