[백준 12851] 숨바꼭질 2 파이썬

2021. 5. 13. 18:32·알고리즘 문제풀이

https://www.acmicpc.net/problem/12851

 

12851번: 숨바꼭질 2

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net

from collections import deque

N,K = map(int,input().split())
MAX = 100000+1

def bfs(N,K):
    visited = [0]*(MAX)
    visited[N] = 1
    time = 0
    min_time = MAX
    cnt= 0
    q = deque([[N,time]])
    while q:
            x,t = q.popleft()
            # print("x,t,cnt : ",x,t,cnt)

            visited[x] = 1

            if t > min_time:
                continue

            if x==K:
                if min_time == t:
                    cnt+=1
                elif min_time == MAX:
                    min_time = t
                    cnt+=1
            else:
                for nx in [x-1,x+1,2*x]:
                    if 0> nx or nx>=MAX:
                        continue
                    if visited[nx]:
                        continue
                    q.append([nx,t+1])

    return min_time,cnt

if N >= K:
    print(N-K)
    print(1)
else:
    min_time, ways =bfs(N,K)
    print(min_time)
    print(ways)
    

풀이

방문한 곳을 2번이상 방문하지 않고 최단시간내에 도착지까지 가야하기 때문에 BFS 로 푼다.

이해가 안가면 아래 그림을 보자

그래프가 3진트리 구조라고 생각하자. 자식노드들은 부모노드의 +1,-1, *2로 구성되어 있는 것이다.

예를들어 2로 시작한다면

 

2 (0단계) -> 1,3,4(1단계) -> 0,2,2,2,4,6,3,5,8 (2단계) -> ...

 

이런식으로 그래프가 만들어지는 것이다.

여기서 방문한 것들은 제외하면서 쭉 목적지를 찾을 때까지 진행하면 bfs 이다.

 

여기서 걸리는 최소 시간은 K를 N단계에서 찾았을 때 최소시간이 곧 N이다.

경로의 방법의 수는 N단계에서 찾았을 때 N단계에 있는 노드들 중 K의 수이다.

 

머리속으로 여기까지 생각하고 구현을 하였는데 구현에서 헷갈렸다.

항상 visited처리를 q에 push하면서 처리했는데 여기서는 pop할 때 visited를 처리해 줌으로서

N단계에 있는 모든 노드를 탐색할 수 있었다.

 

시간복잡도

N을 모두 탐색하니 O(N) 이다.

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

[백준 18405] 경쟁적 전염  (0) 2021.05.12
[백준 1034] 램프  (0) 2021.05.12
[백준 1027] 고층 건물  (0) 2021.05.12
[백준 1004] 어린왕자  (0) 2021.05.12
[백준 15954] 인형들  (0) 2021.05.11
'알고리즘 문제풀이' 카테고리의 다른 글
  • [백준 18405] 경쟁적 전염
  • [백준 1034] 램프
  • [백준 1027] 고층 건물
  • [백준 1004] 어린왕자
WildDevmon
WildDevmon
『앗! 야생의 개발몬(이)가 나타났다!』
  • WildDevmon
    야생의 개발몬
    WildDevmon
  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • Server (5)
      • 알고리즘 문제풀이 (27)
      • 회고 (3)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    terminationGracePeriodSeconds
    백준 1004
    백준 10610
    컴공 취준
    2020 카카오 인턴
    소가 길을 건너간 이유 5
    소수&팰린드롬
    백준 어린 왕자
    ai개발자
    자바 프로세스 종료
    합승 택시 요금
    통나무 자르기
    백준 1027
    백준 경쟁적 전염
    선발 명단
    백준1238
    백준14465
    백준1188
    경력 서류
    백준 인형들
    백준 30
    graceful shutdown
    파이썬
    백준 파티
    카카오 필요스펙
    백준 램프
    백준 1114 파이썬
    네카라쿠배 취업
    백준 1114
    다이렉트 버퍼
    백준2262
    백준15954
    자바 최대공약수
    direct buffer
    백준6980
    네이티브 메모리
    자바 물리 메모리
    자바 스레드 상태
    자바 최소공배수
    코틀린 코루틴
    백준 17281
    백준 5347
    백준 18405
    백준1747
    백준 1034
    preStop
    백준 고층 건물
    우아한 종료
    커널 스레드 상태
    1114백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
WildDevmon
[백준 12851] 숨바꼭질 2 파이썬
상단으로

티스토리툴바