강의로 돌아가기
Dong-Jun-Shin

(BFS + DP) 테스트 25 통과 안되시는 분들 참고하세요 (정답 코드 있음)

[[0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 1, 1, 1, 1, 1, 0], [1, 0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 0, 0, 1, 1, 1], [1, 1, 1, 1, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1, 0]]
위 케이스로 해결되었습니다. (output : 4900, answer : 4500)
(gs11008님이 찾으신 반례이고, berry2971님의 글을 통해 확인하게 되었습니다)


아래처럼 다른 방향에서 코너를 들어와 한 칸에서 만났을 때, 다음 값에서 값의 크기가 역전되는 상황이 생깁니다
값의 차이가 어느 정도일 때, 역전되는 상황이 생기는지 고려해보면 될 거 같습니다

               23 21
26 (27 | 29)      <--- 26에서 꺾어 들어온 값이 더 작음
      (33 | 30)      <--- 다음 값을 계산하니 21에서 들어온 값이 더 작음


몇 시간 붙잡다가, 해결돼서 많이 부족한 지식이지만 혹시 도움이 될까 싶어 글 남겨드립니다
혹시 코드에 문제가 있거나 개선할 점이 있다면 얼마든지 알려주세요.. 피드백 적극 수용합니다!


작성중인 코드―solution.py
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
from collections import deque


def solution(board):
    n = len(board)
    answer = int(1e9)
    dp = [[int(1e9) for _ in range(n)] for _ in range(n)]
    # 현재 지나간 길을 확인하기 위한 idx 추가
    directions = [(-1, 0, 0), (0, 1, 1), (1, 0, 2), (0, -1, 3)]
    # i, j, cost, direction
    q = deque([(0, 0, 0, -1)])
    while q:
        i, j, cost, dir_idx = q.popleft()
        # 정답 범위이고, 현재 cost가 더 적을 때 값 할당
        if (i, j) == (n - 1, n - 1) and answer > cost:
            answer = cost
        for direction in directions:
            # 다음 값 셋팅
            next_i = i + direction[0]
            next_j = j + direction[1]
            add_cost = 1 if dir_idx == direction[2] or dir_idx == -1 else 6
            # 현재 값 판단할 지 여부
            if not (0 <= next_i < n and 0 <= next_j < n) or board[next_i][next_j] == 1:
                continue
            if dp[next_i][next_j] < cost + add_cost - 4:
                continue
            # dp에 값 설정 및 큐에 추가
            dp[next_i][next_j] = cost + add_cost
            q.append((next_i, next_j, cost + add_cost, direction[2]))
    return answer * 100
  • junsgi

    25줄에 -4 는 어떤건가요?

    junsgi―2023.06.11 03:11
1 개의 답변
Kangho Dean Kim

진짜 너무 감사합니다.. 무친 문제네요

  • 김호진

    25번 왜맞틀 하고있었는데 감사합니다...25번 반례는 실제 시험장이였다면 생각 절대 못했을듯하네요

    김호진―2022.02.28 20:45
  • CYJ

    와.. 저런 케이스였군요

    CYJ―2022.11.18 16:59
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.