[Python] 백준 #12851- 숨바꼭질 2

2023. 9. 11. 16:08·코딩테스트/백준[Python]

문제


 

 

12851번: 숨바꼭질 2

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

www.acmicpc.net

코드


My answer

import sys
from collections import deque

def bfs(idx):
    result = 0
    Q=deque()
    Q.append(idx)
    while Q:
        a=Q.popleft()
        direct[2]=a
        if(a==k):
            result+=1
            continue
        for i in range(3):
            new_a=a+direct[i]  
            if(0<=new_a<=limit*2 and (visit[new_a]==0 or visit[new_a]==visit[a]+1)):
                Q.append(new_a)
                visit[new_a]=visit[a]+1
    return result

input = sys.stdin.readline

n,k=map(int,input().split())
direct=[-1,1,0]

limit=max(n,k)
visit=[0 for i in range(2*limit+1)]

result=bfs(n)
print(visit[k])
print(result)

Another answer

풀이


숨바꼭질 1번은 엄청 간단하게 풀었는데 조건 하나 추가됐다고 너무 어려워서 결국 다른 분들의 답을 보고 해결했다 ㅠㅠ

우선 숨바꼭질 1은 그냥 최소 도달 경로만 출력하면 됐는데 2번은 최소로 도달하는 경우가 몇번이나 되는지까지도 출력해야했다. 너무 고민이었던게 몇 번 도착했는지를 체크하려면 같은 곳을 여러번 방문하게 될 수도 있는데 예를 들어 1에서 2를 가는 경우 1+1로 갈 수도 있고, 1*2로도 갈 수 있다. 이런 경우 visit을 체크안하자니 그럼 무한으로 루프가 돌게되고, 새로운 리스트를 만들자니, 그럼 2에서 딴데로 갈 때 앞의 경우를 곱해줘야하는건가 이런 별 생각이 다 들었다.

해결책은 그냥 숨바꼭질 1번 코드에 변수1개와 조건 1개만 추가하면 됐는데, 우선 변수는 최종 경로의 개수를 나타내는 result와 조건은 중간중간 큐에 넣기 위해 체크할 때 위의 조건에서 아래 조건으로 하나가 추가된 것이다.

의미는 지금 방문하게 될 곳이 0 즉 처음 방문하는 곳이거나, 지금 방문하는 방법이랑 똑같은 가지수 일 경우 즉 

아까 든 예시 2로 갈때 이 때 a=1이고 new_a는 반복문을 돌며 2,2,0을 돌게된다. 이때 처음 2가 들어가면 visit[2]=1로 바뀌고, 다음 또 2가들어갔는데 이미 저장되어 있는 1과 지금 또 1이 같으므로, 그냥 넘어간다. 사실 이 조건의 경우는 제일 마지막 k에 도달할 때만 생각하면 되는데 어떠한 방법으로든 k에 도달할 때 또 k가 나오면 result를 올려주면 된다. 즉 방금 설명한 조건은 visit가 있어도 큐에 숫자를 넣기위해 추가해준 것이다. 

(너무 주저리 주저리)

요약: 한 곳에 방문하는 여러 경우의 수를 새기위해서는 방문을 중복으로 체크해줘야한다. 우리는 최종 k에 도달하는 경우만 새면되고 그러기위해서는 큐에 아까 들어간 숫자도 들어가기만 하면 된다. 따라서 이미 지났던 칸이라도 조건에 만족하면 큐에 넣어준다. 

if(0<=new_a<=limit*2 and visit[new_a]==0):
if(0<=new_a<=limit*2 and (visit[new_a]==0 or visit[new_a]==visit[a]+1)):

아래 링크에 다양한 반례가 있어여

https://www.acmicpc.net/board/view/56215

 

글 읽기 - 이거 반례 찾으면 500원 드립니다

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

728x90

'코딩테스트 > 백준[Python]' 카테고리의 다른 글

[Python] 백준 #10815- 숫자 카드  (0) 2023.09.11
[Python] 백준 #1789- 수들의 합  (0) 2023.09.11
[Python] 백준 #1697- 숨바꼭질  (3) 2023.09.08
[Python] 백준 #2668- 숫자고르기  (0) 2023.09.08
[Python] 백준 #10026- 적록색약  (2) 2023.09.07
'코딩테스트/백준[Python]' 카테고리의 다른 글
  • [Python] 백준 #10815- 숫자 카드
  • [Python] 백준 #1789- 수들의 합
  • [Python] 백준 #1697- 숨바꼭질
  • [Python] 백준 #2668- 숫자고르기
창빵맨
창빵맨
  • 창빵맨
    Let's be Developers
    창빵맨
    로그인/로그아웃
  • 전체
    오늘
    어제
    • 분류 전체보기 (471)
      • 알쓸신잡 (79)
      • ML & DL (85)
        • Computer v.. (22)
        • NLP (22)
        • 파이썬 머신러닝 완.. (3)
        • 개념정리 (38)
      • 리눅스 (21)
      • 프로젝트 (29)
        • 산불 발생 예측 (6)
        • 음성비서 (12)
        • pdf 병합 프로그.. (0)
        • 수위 예측 (5)
        • 가짜 뉴스 분류 (5)
        • 전력사용량 예측 (1)
      • 코딩테스트 (217)
        • 프로그래머스[Pyt.. (17)
        • 프로그래머스[Fai.. (3)
        • 백준[Python] (160)
        • 이것이취업을위한코딩.. (18)
        • 파이썬 알고리즘 (19)
      • 데이터분석실습 (25)
        • 데이터 과학 기반의.. (18)
        • 헬로 데이터 과학 (7)
      • 메모장 (0)
      • 잡담 (4)
  • Personal

    GITHUB
    Instagram
  • 공지사항

  • 인기 글

  • 태그

    백준
    파이썬
    이것이취업을위한코딩테스트다
    그리디
    dp
    이분탐색
    BFS
    나동빈
    DFS
    이코테
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3

HOME

HOME

상단으로

티스토리툴바