본문 바로가기

Algorithm

SWEA 5188 최소합 (python)

반응형

5188. [파이썬 S/W 문제해결 구현] 2일차 - 최소합 D3

문제

그림처럼 NxN 칸에 숫자가 적힌 판이 주어지고, 각 칸에서는 오른쪽이나 아래로만 이동할 수 있다.

맨 왼쪽 위에서 오른쪽 아래까지 이동할 때, 지나는 칸에 써진 숫자의 합계가 최소가 되도록 움직였다면 이때의 합계가 얼마인지 출력하는 프로그램을 만드시오.

1 2 3
2 3 4
3 4 5

그림의 경우 1, 2, 3, 4, 5순으로 움직이고 최소합계는 15가 된다. 가능한 모든 경로에 대해 합을 계산한 다음 최소값을 찾아도 된다.

[입력]

첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50

다음 줄부터 테스트 케이스의 별로 첫 줄에 가로 세로 칸 수 N이 주어지고, 다음 줄부터 N개씩 N개의 줄에 걸쳐 10이하의 자연수가 주어진다. 3<=N<=13

[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

풀이과정

맨처음에 dfs 를 이용하여 풀려다가 잘못풀었다.

import sys
sys.stdin = open("input.txt")

T = int(input())

def road(x, y):
    global temp, total
    if x == y == N-1:
        temp += arr[y][x]
        if temp < total:
            total = temp
            return
        else:
            return
    elif x > N-1 or y > N-1:
        return
    else:
        if not visited[y][x]:
            visited[y][x] = 1
            temp += arr[y][x]
            road(x+1, y)
            road(x, y+1)






for tc in range(1, T+1):
    N = int(input())
    arr = [list(map(int,input().split()))for _ in range(N)]
    temp = 0
    total = 10 * 2 * N
    visited = [[0 for _ in range(N)]for _ in range(N)]
    road(0, 0)


    print("#{} {}".format(tc, total))
import sys
sys.stdin = open("input.txt")

T = int(input())

def road(x, y, total):
    global result
    if x == N-1 and y == N-1:
        total += arr[y][x]
        if total < result:
            result = total
            return
    if total > result:
        return

    dx = [1, 0]
    dy = [0, 1]

    for i in range(2):
        x += dx[i]
        y += dy[i]
        if x > N-1 or y > N-1:
            continue
        if not visited[y][x]:
            visited[y][x] = 1
            road(cx, cy, total + arr[y][x])
            visited[y][x] = 0









for tc in range(1, T+1):
    N = int(input())
    arr = [list(map(int,input().split()))for _ in range(N)]
    temp = 0
    result = 10 * 2 * N
    visited = [[0 for _ in range(N)]for _ in range(N)]
    road(0, 0, 0)


    print("#{} {}".format(tc, result))

다음으로는 이렇게 풀었는데 x와 y를 설정해 주는 것이 틀렸다.

이상하게 나옴

풀이

T = int(input())

# 길찾기 dfs
def road(x, y, total):
    global result
    # 만약 도착했다면
    if x == N-1 and y == N-1:
        # 마지막 도착점것을 더해주고
        total += arr[y][x]
        # 최소값을 갱신해준다.
        if total < result:
            result = total
            return
    # 시간을 줄이기위해 과정중에 현재 최소값 보다 크면 계산 가치 x
    if total > result:
        return

    dx = [1, 0]
    dy = [0, 1]

    # 모드를 돌아다니면서 검색
    for i in range(2):
        # 다음 좌표 둘러보기
        cx = x + dx[i]
        cy = y + dy[i]
        # 만약 범위 넘어가면 패스
        if x > N-1 or y > N-1:
            continue
        # 방문한 적이 없다면
        if not visited[y][x]:
            # 방문도장 찍고
            visited[y][x] = 1
            # 다음 좌표 보면서 total 값도 같이 넘겨줌
            road(cx, cy, total + arr[y][x])
            # 돌아왔다면 방문도장 지워주기
            visited[y][x] = 0

for tc in range(1, T+1):
    N = int(input())
    arr = [list(map(int,input().split()))for _ in range(N)]
    # 결괏값은 최대값으로 설정
    result = 10 * 2 * N
    # 방문 검사를 위한 배열
    visited = [[0 for _ in range(N)]for _ in range(N)]
    # 길찾아보자 - 함수호출
    road(0, 0, 0)


    print("#{} {}".format(tc, result))
반응형

'Algorithm' 카테고리의 다른 글

SWEA 4831 전기버스 (python)  (0) 2021.04.19
SWEA 4828 min_max (python)  (0) 2021.04.19
SWEA 4837 부분집합의 합 (python)  (0) 2021.04.19
SWEA 3752 가능한 시험점수 (python)  (0) 2021.04.19
BOJ 13305 주유소 (python) 파이썬  (0) 2021.04.15