반응형
snowman95
코딩수련장
snowman95
전체 방문자
오늘
어제
  • 분류 전체보기 (229)
    • 앱테크 (3)
    • 옵시디언 (5)
    • 드라마, 영화 (1)
    • 개발자 이야기 (23)
    • 프로젝트 (10)
      • 프로젝트 방법론 (7)
      • 프로젝트 기록 (2)
      • Github (1)
    • 개발 지식 (0)
      • 디자인 패턴 (0)
    • 프론트엔드 개발 (5)
      • 테크트리 (2)
      • React.js (19)
      • ReactNative (2)
      • Next.js (6)
      • GraphQL (6)
      • 패키지 매니저 (2)
      • 라이브러리 (3)
      • 상태관리 라이브러리 (4)
      • Web 지식 (3)
      • HTML CSS (26)
      • Javascript (16)
      • 도구 (Tool) (3)
      • 성능 최적화 (1)
      • 디자인시스템 (0)
    • Python (53)
      • 모음집 (1)
      • 문법 (12)
      • 라이브러리 (15)
      • 알고리즘 (10)
      • 백준 문제풀이 (9)
      • 코딩테스트 (2)
      • 도구 (Tool) (3)
    • C++ (20)
      • 알고리즘 (6)
      • 삼성SW기출 (6)
      • 삼성 A형 (6)
    • 데이터사이언스 (1)
    • 인프라 (9)
      • 하드웨어 지식 (4)
      • Ansible (2)
      • Database (2)
      • 쉘스크립트 (1)
    • 주식 (0)
    • 취업 준비 (4)
      • 취업 이야기 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • Next.js #graphql #tailwind.css
  • GraphQL
  • 삼성SDS
  • 나의 해방일지
  • 기계식키보드 #nuphy
  • 공간복잡도
  • nextjs
  • 면접
  • 전공 요약 #데이터베이스
  • C++
  • A형
  • 전공요약
  • 언어
  • 오블완
  • 삼성SW역량테스트
  • 알고리즘
  • 백준
  • 전공 요약 #네트워크
  • 티스토리챌린지
  • 전공 요약 #운영체제

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
snowman95

코딩수련장

Python/백준 문제풀이

파이썬(python) 백준 14496 : 그대, 그머가 되어

2021. 5. 19. 11:48
728x90
반응형
 

14496번: 그대, 그머가 되어

첫째 줄에 머호가 바꾸려 하는 문자 a와 b가 주어진다. 둘째 줄에 전체 문자의 수 N과 치환 가능한 문자쌍의 수 M이 주어진다. (1 <= N <= 1,000, 1 <= M <= 10,000) 이후 M개의 줄에 걸쳐 치환 가능한 문자쌍

www.acmicpc.net

문제 내용

시간 제한 : 2 초

메모리 : 512 MB

 

문자 a를 문자 b로 바꾸려하고, N개의 문자와 치환 가능한 문자쌍 M개가 있다.

a를 b로 바꾸기 위한 치환의 최소 횟수를 구하라

 

입력

첫째 줄에 머호가 바꾸려 하는 문자 a와 b가 주어진다.

둘째 줄에 전체 문자의 수 N과 치환 가능한 문자쌍의 수 M이 주어진다. (1 <= N <= 1,000, 1 <= M <= 10,000)

이후 M개의 줄에 걸쳐 치환 가능한 문자쌍이 주어진다. 모든 문자는 N이하의 자연수로 표현된다.

 

출력

a를 b로 바꾸기 위해 필요한 최소 치환 횟수를 출력한다. 치환이 불가능한 경우는 –1을 출력한다.

 

예제 입력 1

1 2

4 4

1 3

1 4

3 2

4 2

 

예제 출력 1 

2


유형

  • 그래프 이론
  • 그래프 탐색
  • 너비 우선 탐색
  • 다익스트라

풀이

문제만 봐서는 이해가 안되는데 양방향 그래프 문제이다.

모든 간선 비용은 1

→ 가중치가 없는 최단경로 구하기 문제 = BFS (공식 암기하세요)

 

따라서 2가지 방법으로 풀이 가능하다.

  1. 다익스트라
  2. 너비우선탐색 (BFS)

BFS 풀이 시 주의할 점이 있다.

문제에서는 나와있지 않지만, 

a==b 이고, a→b 간선 정보가 주어지지 않은 경우

최소치환횟수는 -1이 아닌 0이 되어야 한다.

 

이 부분을 유의하지 않고 코드를 짜면 -1을 출력하여 오답을 받을 수도 있다.

설명이 다소 불친절한 문제라고 생각이 되다.

 

 

다익스트라 풀이

import sys, heapq
MAX = int(1e9)
a,b = map(int,sys.stdin.readline().split())
n,m = map(int,sys.stdin.readline().split())

board = [[] for _ in range(n+1)]
for _ in range(m):
    x,y = map(int,sys.stdin.readline().split())
    board[x].append(y)
    board[y].append(x)

dist_arr = [MAX]*(n+1)
dist_arr[a]=0
q = []
heapq.heappush(q, (0,a))
while q:
    dist, cur = heapq.heappop(q)
    if dist_arr[cur] < dist:
        continue

    for next in board[cur]:
        if dist_arr[next] > dist+1:
            dist_arr[next] = dist+1
            heapq.heappush(q, (dist+1,next))

if dist_arr[b] == MAX:
    print(-1)
else:
    print(dist_arr[b])

 

너비우선탐색 (BFS) 풀이

import sys, collections
MAX = int(1e9)
a,b = map(int,sys.stdin.readline().split())
n,m = map(int,sys.stdin.readline().split())

board = [[] for _ in range(n+1)]
for _ in range(m):
    x,y = map(int,sys.stdin.readline().split())
    board[x].append(y)
    board[y].append(x)

min_change_cnt = MAX
visited = [False]*(n+1)
visited[a] = True
q = collections.deque([(a,0)])
while q:
    cur,dist = q.popleft()
    if cur == b:
        min_change_cnt = min(min_change_cnt,dist)
    for next in board[cur]:
        if not visited[next]:
            visited[next] = True
            q.append((next,dist+1))

if min_change_cnt == MAX:
    min_change_cnt = -1
print(min_change_cnt)
반응형
저작자표시 동일조건 (새창열림)

'Python > 백준 문제풀이' 카테고리의 다른 글

파이썬(python) 백준 1987 : 알파벳  (0) 2021.05.29
파이썬(python) 백준 16236 : 아기 상어  (2) 2021.05.25
파이썬(python) 백준 2206 : 벽 부수고 이동하기  (0) 2021.05.02
파이썬(python) 백준 7576 : 토마토  (0) 2021.05.01
파이썬(python) 백준 2580 : 스도쿠  (0) 2021.04.22
    'Python/백준 문제풀이' 카테고리의 다른 글
    • 파이썬(python) 백준 1987 : 알파벳
    • 파이썬(python) 백준 16236 : 아기 상어
    • 파이썬(python) 백준 2206 : 벽 부수고 이동하기
    • 파이썬(python) 백준 7576 : 토마토
    snowman95
    snowman95
    (17~19) Unity/Unreal Engine 게임 프로그래머 (20~21) System Administrator ___________ (22~) React 웹 프론트앤드 개발자 __________ 깃헙 : https://github.com/snowman95

    티스토리툴바