Skip to content

Conversation

@Mingguriguri
Copy link
Collaborator

🌱WIL

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

  • 이번 주에 정신없어서 토요일에 몰아서 풀긴 했지만 다음 주에는 꾸준히 풀도록 하겠습니다! 저번 주에 풀지 못했던 발제, 과제 문제도 함께 풀어 올립니다!

🚀주간 목표 문제 수: 3개

푼 문제


백준 #2644. 촌수계산: 그래프 / 실버2

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

🚩플로우 (선택)

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

  1. 입력 변수를 초기화하고 그래프를 연결한다.
    1. 전체 사람 수 n, 촌수를 계산할 두 사람의 번호 ab를 입력받고, 부모-자식 관계의 개수 m줄만큼 x, y를 입력받아 graph를 연결한다.
  2. 방문 여부를 기록할 visited 리스트를 초기화한다.
  3. 결과를 담을 변수 chonsu-1로 설정하여 촌수를 찾지 못한 경우를 대비한다.
  4. 백트래킹을 시작한다.
    1. 시작 노드는 a로 지정하고 탐색을 시작한다.
    2. 각 노드에 대해 방문 여부를 체크하고, 방문한 노드는 level+1을 넘겨줘서 촌수를 계산한다.
    3. 만약 탐색 중인 노드가 b라면, chonsu 변수에 level을 업데이트하고 재귀 호출을 종료한다.
  5. 탐색한 결과인 chonsu를 출력한다.

🚩제출한 코드

# 2644-촌수계산. DFS(백트래킹) 풀이
import sys

input = sys.stdin.readline

n = int(input())                    # 전체 사람 수
a, b = map(int, input().split())    # 촌수 계산해야 하는 두 사람의 번호
m = int(input())                    # 부모 자식들간의 관계의 개수
graph = [[] for _ in range(n + 1)]  # 그래프
visited = [False for _ in range(n + 1)]  # 방문여부
for _ in range(m):
    x, y = map(int, input().split())
    # 그래프 연결
    graph[x].append(y)
    graph[y].append(x)

chonsu = -1  #  정답으로 반환할 촌수; 기본값은 -1로 설정하여 찾지 못한 경우에 대비

def backtracking(v, level):
    global result
    # 재귀함수 마치는 조건: a,b 촌수를 계산이 되었을 때
    if v == b:
        chonsu = level
        return

    # 탐색
    for i in graph[v]:
        if not visited[i]:
            visited[i] = True
            backtracking(i, level + 1)  # 자식 노드 방문 level + 1을 넘겨줌으로써 촌수 계산
            visited[i] = False          # 방문했다면 부모노드 다시 방문 기록 지움


visited[a] = True # 초기 노드 방문 체크
backtracking(a, 0)
print(chonsu)

💡TIL

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

  • 백트래킹으로 풀기 위해서는 꼭 종료 조건을 설정해야 한다.

백준 #5014. 스타트링크: 그래프 / 실버1

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

🚩플로우 (선택)

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

  1. 입력으로 F, S, G, U, D를 받는다.
  2. BFS 탐색을 수행한다.
    1. S == G → 시작과 동시에 도착한 경우 → 0을 반환한다.
    2. 큐에 (현재 층, 버튼 클릭 횟수)를 저장한다.
    3. 위/아래 이동 가능 여부 확인한다.
      • 범위(1 ~ F)를 벗어나지 않고, 아직 방문하지 않은 층일 경우 큐에 삽입한다.
    4. 탐색 도중 G층을 만나면 버튼 클릭 횟수를 반환한다.
  3. 결과가 -1이면 "use the stairs", 아니면 횟수를 출력한다.

🚩제출한 코드

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

# 총 층수 F, 현재 층 S, 목표 층 G, 위 버튼 U, 아래 버튼 D
F, S, G, U, D = map(int, input().split())

def bfs():
    if S == G: # 강호가 이미 도착해있다면 0번 클릭
        return 0
        
    visited = [False for _ in range(F + 1)]
    queue = deque([(S, 1)]) # (현재 층, 버튼 클릭 횟수)
    visited[S] = True

    while queue:
        x, cnt = queue.popleft()

        # 위로 이동
        nx = x + U
        if nx <= F and not visited[nx]:
            if nx == G: # 목표층 도착
                return cnt
            queue.append((nx, cnt + 1))
            visited[nx] = True # 방문여부 표시 꼭 넣어주기

        # 아래로 이동
        nx = x - D
        if nx > 0 and not visited[nx]:
            if nx == G: # 목표층 도착
                return cnt
            queue.append((nx, cnt + 1))
            visited[nx] = True
		
		# 목표층에 도달하지 못한 경우
    return -1

# BFS 탐색
answer = bfs()
if answer == -1:
    print("use the stairs")
else:
    print(answer)

💡TIL

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

  • 방문여부 표시 여부를 꼭 넣어줘야 하는데 넣어주지 않아서 예외 케이스시에 문제가 발생했다. 꼭 주의하자!
  • 개인적으로 엘리베이터로 이동하는 재미있는 BFS 문제유형이라고 생각한다. “최소값”을 구하는 말에서 BFS로 풀어야 하는 문제 유형임을 알 수 있다. 또 복잡한 그래프가 필요없이 1차원으로 해결할 수 있고, 방향도 2가지밖에 없어 무난한 문제이다.

백준 #1158. 요세푸스 문제: 구현 / 실버4

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

🚩플로우 (선택)

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

  • deque에 1부터 N까지 사람들을 저장한다.
  • answer 리스트를 만들어 제거되는 순서를 담는다.
  • while 루프를 돌면서,
    • K-1번 만큼 맨 앞 요소를 pop → append (자리 이동)
    • K번째에서 pop된 사람을 answer에 추가
  • 모든 사람이 제거될 때까지 반복한다.
  • 마지막에 "<3, 6, 2, ...>" 형식으로 출력한다.

🚩제출한 코드

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

N, K = map(int, input().split())
# 1번부터 N번까지 사람을 큐에 넣기
people = deque([i+1 for i in range(N)])
answer = [] # 제거된 순서를 저장할 리스트

while people:
		# K-1번 앞의 원소를 빼서 뒤로 보냄 (원형 이동)
    for _ in range(K-1):
        cur = people.popleft()
        people.append(cur)
    # K번째에서 제거
    answer.append(people.popleft())

# 정답 출력
print("<" + ", ".join(map(str, answer)) + ">")

💡TIL

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

  • 다른 분의 풀이를 통해 collections.deque 에서 rotate() 메서드가 있다는 것을 알게 되었다. rotate(n) 메서드는 deque 내의 요소들을 n만큼 이동시켜주는 연산이다.
  • 다른 풀이에서는 굳이 큐 연산을 사용하지 않고 나머지 연산을 이용하여 이동할 수 있다는 것을 알게 되었다.
  • 또한 파이썬에서 문자열 출력할 때 ,를 쓰면 스페이스바가 추가된 채로 되어서 end=””를 써서 출력했는데 “+” 로할 수 있다는 것도 알게 되었다.

백준 #28066. 타노스는 요세푸스가 밉다: 구현 / 실버2

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

🚩플로우 (선택)

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

  • 입력값 N, K를 받는다.
  • deque에 1번부터 N번까지 청설모를 저장한다.
  • while문으로 청설모가 1마리 남을 때까지 반복한다.
    • 현재 남아 있는 청설모 수가 K보다 작으면 ⇢ 첫 번째 청설모를 제외한 나머지를 제거하고 종료한다.
    • 그렇지 않으면:
      • popleft() ⇢ 첫 번째 청설모를 꺼내고 append() ⇢ 맨 뒤로 보낸다.
      • remove() 함수로 K-1마리 제거한다.
  • 마지막에 남아 있는 청설모 번호를 출력한다.

🚩제출한 코드

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

# 청설모 K-1마리를 제거하는 함수
def remove():
    global squirrels
    cnt = K - 1
    while cnt > 0 and squirrels:  # squirrels이 비지 않았는지 확인
        squirrels.popleft()
        cnt -= 1

N, K = map(int, input().split())
squirrels = deque([i+1 for i in range(N)])  # 청설모 번호 초기화
answer = 0  # 마지막으로 남는 청설모의 번호

# 청설모가 1마리 남을 때까지 반복
while len(squirrels) > 1:
    # 남은 청설모가 K보다 적으면 첫 번째 제외 모두 제거
    if len(squirrels) < K:
        print(squirrels[0])
        exit()

    # 첫 번째 청설모를 맨 뒤로 보냄
    squirrels.append(squirrels.popleft())
    # 첫 번째 청설모를 제외한 K-1마리를 제거
    remove()

# 마지막으로 남은 청설모 출력
print(squirrels[0])

💡TIL

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

  • 케이스가 많이 없으니 직접 케이스를 만들어서 잘 처리되는지 검산해보면서 풀이했다.
  • deque.rotate()를 이용하면 훨씬 간단하게 표현할 수 있다. 런타임 에러가 발생했더너 부분은 엣지 케이스(남은 청설모가 K보다 적을 때)를 먼저 처리해야 해결할 수 있었다.

Copy link
Collaborator

@zaqquum zaqquum left a comment

Choose a reason for hiding this comment

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

전 주 문제까지 푸시느라 고생하셨습니다!

Copy link
Collaborator

Choose a reason for hiding this comment

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

저는 bfs로 풀었는데 백트레킹을 사용한 dfs로 풀이한 점이 인상적이었습니다.

@Mingguriguri Mingguriguri merged commit 30be2a8 into main Aug 18, 2025
@github-actions
Copy link

🔥2025-08 챌린지 진행 상황

👉 그래프

  • Mingguriguri: 2개 ❌

👉 구현

  • Mingguriguri: 2개 ❌

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