[Python] 백준 2572 보드게임

2021. 9. 21. 23:42·CS/알고리즘 & 문제풀이

문제 링크 : https://www.acmicpc.net/problem/2572

 

2572번: 보드게임

첫째 줄에 카드의 수 N이 주어진다. 둘째 줄에 N장의 카드의 색깔이 번호 순서대로 빈칸을 사이에 두고 주어진다. 셋째 줄에는 마을의 수 M과 길의 수 K가 빈칸을 사이에 두고 주어진다. 이어 K개

www.acmicpc.net

1. 접근 방법

처음에는 문제를 잘못 읽어 너무 많은 경우의 수가 아닌가 하는 생각을 했다.

카드를 순서대로 뽑으며 각 이동하는 모든 경우의 수를 계산해야 되고, 최대 탐색 마을의 수와 카드의 수가 적지 않아 DP와 DFS 중 고민했다. 그런데 길의 수가 마을에 비해 너무 많아 DP가 더 적절할 것 같아 DP로 접근했지만, 쉽지는 않았다.

 

 

2. 풀이 코드

🖥python

import sys
input = sys.stdin.readline

n = int(input())
cards = list(input().strip().split())

m, k = map(int, input().split())
cities = [[] for _ in range(m + 1)]
for _ in range(k):
    a, b, c = input().strip().split()
    a, b = int(a), int(b)
    cities[a].append((b, c))
    cities[b].append((a, c))

# i번째 카드를 냈을 때 j번 마을에 있다면
dp = [[-1] * (m + 1) for _ in range(n + 1)]
dp[0][1] = 0
for i in range(n):
    # 이번 카드의 생상
    color = cards[i]
    # 1번 마을부터 m번 마을까지
    for j in range(1, m + 1):
        # 해당 마을까지 도착했을 때
        cost = dp[i][j]
        if cost >= 0:
            # 해당 마을에서 연결된 마을로 이동 탐색
            for k, c in cities[j]:
                # j >> k 비용과 기존 k마을까지 비용 비교
                if color == c and dp[i + 1][k] < cost + 1:
                    dp[i + 1][k] = cost + 1
                elif color != c and dp[i + 1][k] < cost:
                    dp[i + 1][k] = cost

if max(dp[-1]) == -1:
    print(0)
else:
    print(max(dp[-1]) * 10)

📕풀이과정

DP배열을 1차원으로 시도하려 했지만, 몇 번째 카드에서 각 마을에 도착했는지가 다시 영향을 미치게 되어 2차원 배열을 선택해야 했다.

이 외에는 각 순서의 카드를 선택하고, 해당 순번에 마을에 도착했다면, 해당 마을에서 연결된 마을을 모두 탐색한다. 여기서 두 가지로 나누어 시행하는데, 해당 도로의 색이 카드의 색과 같다면 점수를 추가하여, 아니라면 해당 점수로 최대 점수인지 비교하여 최신화한다.

 

 

3. 생각 정리

python으로 통과한 코드가 없고, 모두 시간초과였다. 조금 더 빠르게, 효율적으로 해결할 수 있지 않을까 라는 생각도 하지만, 아쉬운 건 아쉬운 대로 남겨두고, 우선은 문제를 잘 풀어가는데 집중하는 게 맞는 것 같다.

시간을 줄이는 부분을 생각해본다면, 탐색에서 줄이는 방법이 있어야 할 것 같은데, 딱히 떠오르지 않아 아쉬운 생각도 남는다.

'CS > 알고리즘 & 문제풀이' 카테고리의 다른 글

[Python] 백준 1398 동전 문제  (0) 2021.10.08
[Python] 백준 9080 PC방 요금  (0) 2021.10.07
[Python] 백준 12787 지금 밥이 문제냐  (0) 2021.09.20
[Python] 백준 6568 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다  (0) 2021.09.19
[Python] 백준 1338 알 수 없는 번호  (0) 2021.09.18
'CS/알고리즘 & 문제풀이' 카테고리의 다른 글
  • [Python] 백준 1398 동전 문제
  • [Python] 백준 9080 PC방 요금
  • [Python] 백준 12787 지금 밥이 문제냐
  • [Python] 백준 6568 귀도 반 로썸은 크리스마스날 심심하다고 파이썬을 만들었다
mintropy
mintropy
민트로피의 하루하루 오늘보다 더 나은 내일
  • mintropy
    민트로피의 민트초코
    mintropy
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 생각 정리
        • 코딩테스트
        • SSAFY
      • 디지털 노트
        • Obsidian.md
        • Notion
      • CS
        • 알고리즘 & 문제풀이
        • AI
        • DB
        • 디자인패턴
      • Projects
      • Python
        • Python Web Framework
      • JavaScript
        • React.js
      • Docker
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    백준
    프로젝트
    Combinatorics
    project_zero
    코딩테스트
    파이썬
    ps
    그리디
    Python
    line
    union-find
    django
    fastapi
    DP
    게임이론
    trie
    markdown
    DRF
    카카오
    bfs
    SSAFY
    구현
    조건분기
    브루트포스
    dfs
    pydantic
    프로그래머스
    회고
    web framework
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
mintropy
[Python] 백준 2572 보드게임
상단으로

티스토리툴바