Skip to content

Conversation

@Mingguriguri
Copy link
Collaborator

@Mingguriguri Mingguriguri commented Jun 14, 2025

🌱WIL

이번 한 주의 소감을 작성해주세요!

  • 이번 주는 BFS와 구현 문제를 풀었다. 부트캠프랑 병행하다보니 매일 풀지 못해 아쉽다. 숨바꼭질 시리즈 문제는 연습하기 좋은 것 같아서 나중에 숨바꼭질3,4도 풀어보려고 한다. 숨바꼭질2 의 경우, 다른 BFS와 다르게 2최소 개수뿐 아니라 방법의 수도 함께 찾는 문제라 어려웠다. 하지만 연습하고 인사이트를 얻기 좋은 문제였따.
  • 구현 문제는 "주식"에 관심있어서 기적의매매법 문제를 풀게 되었다. 실버5라 만만히 봤지만 조건 처리하는 것이 쉽지 않았던 것 같다. 구현 문제는 문제 정의를 잘 정리하고 코드 작성하기 전에 미리 설계를 한 후에 들어가야 할 것 같다.

🚀주간 목표 문제 수: 3개

푼 문제


백준 #12851. 숨바꼭질2: 그래프 / 골드4

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  1. MAX = 100000으로 문제에서 주어진 최대 범위를 설정한다.
  2. N, K를 입력받아 수빈이의 위치와 동생의 위치를 저장한다.
  3. 다음 두 개의 배열을 초기화한다:
    • dist: 각 위치까지 도달하는 최소 시간을 저장 (초기값 -1)
    • ways: 각 위치까지 최소 시간으로 도달하는 방법의 수를 저장 (초기값 0)
  4. queue를 생성하고 시작점 N을 넣는다.
    • dist[N] = 0: 시작점은 0초에 도달
    • ways[N] = 1: 시작 위치에는 한 가지 방법으로 도달
  5. BFS 탐색 시작 (큐가 빌 때까지 반복):
    • x = queue.popleft(): 현재 위치를 꺼낸다.
    • 다음 이동 가능한 위치들을 계산: x - 1, x + 1, x * 2
      • 각각에 대해 다음 조건을 처리한다:
        • 범위 조건 검사: 0 ≤ nx ≤ 100000인 경우만 유효
        • 처음 방문하는 위치(nx):
          • dist[nx] == -1이면 아직 방문하지 않은 곳이므로,
            • dist[nx] = dist+ 1: 현재 위치에서 한 번 더 이동한 시간
            • ways[nx] = ways[x]: 이전 위치까지 도달하는 모든 방법 수를 그대로 가져옴
            • queue.append(nx)로 큐에 추가
        • 이미 방문한 위치지만 동일 시간에 도달 가능한 경우:
          • dist[nx] == dist+ 1이면,
            • ways[nx] += ways[x]: 추가로 또 다른 경로가 생긴 것이므로 누적
  6. BFS 종료 후:
    • print(dist[K]): 동생 위치에 도달하는 최소 시간
    • print(ways[K]): 해당 시간으로 동생에게 도달할 수 있는 방법 수

🚩제출한 코드

import sys
from collections import deque

input = sys.stdin.readline

MAX = 100000
N, K = map(int, input().split())
dist = [-1] * (MAX + 1)
ways = [0] * (MAX + 1)

queue = deque([N])
dist[N] = 0
ways[N] = 1

while queue:
    x = queue.popleft()

    for nx in (x - 1, x + 1, x * 2):
		    # 범위 내
        if 0 <= nx <= MAX:
		        # 아직 방문하지 않은 위치
            if dist[nx] == -1: 
                dist[nx] = dist[x] + 1 # 현재 걸린 시간 +1 초
                ways[nx] = ways[x] # 이전 위치에서 오는 방법의 수 가져오기
                queue.append(nx)
            # 이미 방문했지만, 같은 시간에 다시 도달한 경우    
            elif dist[nx] == dist[x] + 1: 
                ways[nx] += ways[x] # 기존 방법 수 + 새로운 경로 수

print(dist[K])
print(ways[K])

💡TIL

배운 점이 있다면 입력해주세요

  • 보통 BFS 탐색을 할 떄 2차원인 경우가 많았는데 1차원인 경우에도 범위를 설정하는 것이 중요하다는 것을 알게 되었다. 즉, 큐에는 필요한 값만 추가하는 게 좋다는 것을 알게 되었다.
  • BFS를 최소 개수 뿐만 아니라 몇 가지 방법으로 도달할 수 있는지로 응용할 수 있다는 것을 알게 되었다.

백준 #1697. 숨바꼭질: 그래프 / 실버1

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  1. 입력 처리:
    • N, K를 입력받고 최대 크기인 100001만큼 방문 배열을 만든다.
  2. BFS 초기화:
    • visited[N] = 0으로 시작 위치 설정
    • 큐에 시작 위치 N을 넣는다
  3. BFS 반복:
    • 큐에서 현재 위치 current를 꺼낸다
    • 만약 current == K라면 탐색 종료
    • 이동 가능한 3가지 경우(current-1, current+1, current*2)를 모두 탐색
      • 해당 위치가 범위 내이고 아직 방문하지 않았다면:
        • visited[nx] = visited[current] + 1
        • nx를 큐에 추가
  4. 출력:
    • visited[K]값이 정답 (가장 빠르게 동생을 찾는 시간)

🚩제출한 코드

import sys
from collections import deque
input = sys.stdin.readline

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

visited = [0] * (MAX+1)
queue = deque([N])

while queue:
    current = queue.popleft()
    if current == K:
        break
    for nx in (current + 1, current - 1, current * 2):
        if 0 <= nx <= MAX and not visited[nx]:
            visited[nx] = visited[current] + 1
            queue.append(nx)

print(visited[K])

💡TIL

배운 점이 있다면 입력해주세요

  • 이전에 [백준 #12851. 숨바꼭질2](https://www.acmicpc.net/problem/12851) 문제를 풀어서 큰 어려움 없이 풀 수 있었다.
  • 문제의 조건을 잘 파악해야 한다. 이 문제의 경우 0 ≤ N ≤ 100000이므로 100000을 포함하여 인덱싱 해야 했다. 이 부분을 놓치게 되면 런타임 에러(IndexError)가 날 수 있으니 주의하자

백준 #20546. 기적의매매법: 구현 / 실버5

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

🚩제출한 코드

import sys
import math
input = sys.stdin.readline

money = int(input())
prices = list(map(int, input().split()))

# 준현이 (BNP)
jh_cash = money
jh_stock = 0
for price in prices:
    if jh_cash >= price:
        jh_stock += jh_cash // price
        jh_cash = jh_cash % price
jh_total = jh_cash + jh_stock * prices[-1]

# 성민이 (TIMING)
sm_cash = money
sm_stock = 0
for i in range(3, 14):
    # 3일 연속 상승
    if prices[i-3] < prices[i-2] < prices[i-1]:
        sm_cash += sm_stock * prices[i]
        sm_stock = 0
    # 3일 연속 하락
    elif prices[i-3] > prices[i-2] > prices[i-1]:
        can_buy = sm_cash // prices[i]
        sm_stock += can_buy
        sm_cash -= can_buy * prices[i]
sm_total = sm_cash + sm_stock * prices[-1]

# 결과 출력
if jh_total > sm_total:
    print("BNP")
elif jh_total < sm_total:
    print("TIMING")
else:
    print("SAMESAME")

💡TIL

배운 점이 있다면 입력해주세요

  • 구현 문제는 사소한 조건도 잘 분기처리해야 한다는 것을 알게 되었다. 성민이의 조건이 까다로웠는데 3일 연속 상승, 연속 하락하는 조건을 구현하는 것이 쉽지 않았다.

@Mingguriguri Mingguriguri self-assigned this Jun 14, 2025
@Mingguriguri Mingguriguri removed the request for review from learntosurf June 15, 2025 04:42
Copy link
Member

@YoonYn9915 YoonYn9915 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

그래프 탐색 문제에서 최소 시간 외에 다른 조건이 붙은 경우 어떻게 처리해야 할 지 연습이 된 좋은 문제 출제해주셔서 감사합니다!!

아직 방문하지 않은 경우, 이미 방문했지만 같은 시간에 또 다시 도달한 경우 경로를 어떻게 업데이트 할 지 떠올리는게 이 문제 핵심이었던 것 같은데 이 부분에서 잘못된 연산을 해서 문제를 못 풀었던 것 같아요. 예전에 동아리에서 이런 비슷한 문제를 했었는데 이번에 시간안에 못 풀어서 좀 아쉬웠습니다...

@Mingguriguri
Copy link
Collaborator Author

그래프 탐색 문제에서 최소 시간 외에 다른 조건이 붙은 경우 어떻게 처리해야 할 지 연습이 된 좋은 문제 출제해주셔서 감사합니다!!

아직 방문하지 않은 경우, 이미 방문했지만 같은 시간에 또 다시 도달한 경우 경로를 어떻게 업데이트 할 지 떠올리는게 이 문제 핵심이었던 것 같은데 이 부분에서 잘못된 연산을 해서 문제를 못 풀었던 것 같아요. 예전에 동아리에서 이런 비슷한 문제를 했었는데 이번에 시간안에 못 풀어서 좀 아쉬웠습니다...

아쉬웠을테지만 그래도 이번 기회에 복습하게 되었으니 다음에는 더 잘 푸실거예요!

@Mingguriguri Mingguriguri merged commit 0277738 into main Jun 16, 2025
@github-actions
Copy link

🔥2025-06 챌린지 진행 상황

👉 그래프

  • YoonYn9915: 1개 ❌
  • Mingguriguri: 2개 ❌

👉 구현

  • YoonYn9915: 0개 ❌
  • Mingguriguri: 1개 ❌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants