Skip to content

Commit beb9ee7

Browse files
committed
feat: 6월 2주차 발제 자료 업로드
1 parent 8c38a8c commit beb9ee7

File tree

4 files changed

+177
-0
lines changed

4 files changed

+177
-0
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"""
2+
BOJ #1697. 숨바꼭질 (실버1)
3+
https://www.acmicpc.net/problem/1697
4+
유형: Graph, BFS
5+
"""
6+
7+
# PR 올릴 때 정답도 함께 공개 예정
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
## 🚀6월 2주차 (4/07) 스터디 발제 주제: BFS
2+
> 발제자: 김민정
3+
4+
> 주제: BFS
5+
6+
### 🗂️ 스터디 자료
7+
- PDF: [바로가기
8+
](./Study_BOJ_12851..pdf)
9+
10+
### 📖 문제
11+
- [백준 #12851. 쉬운계단수](https://www.acmicpc.net/problem/12851): BFS / 골드4
12+
- 정답 코드: [Study_BOJ_12851_숨바꼭질2.py](./Study_BOJ_12851_숨바꼭질2.py)
13+
14+
15+
### 💻 과제
16+
- [백준 #1697. 숨바꼭질](https://www.acmicpc.net/problem/1697): BFS / 실버1
17+
- 정답 코드: [Assignment_BOJ_1697_숨바꼭질.py](./Assignment_BOJ_1697_숨바꼭질.py)
625 KB
Binary file not shown.
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
"""
2+
BOJ #12851. 숨바꼭질2 (골드4)
3+
https://www.acmicpc.net/problem/12851
4+
유형: Graph, BFS
5+
"""
6+
7+
"""
8+
풀이1
9+
"""
10+
import sys
11+
from collections import deque
12+
13+
input = sys.stdin.readline
14+
15+
MAX = 100000
16+
N, K = map(int, input().split())
17+
dist = [-1] * (MAX + 1)
18+
ways = [0] * (MAX + 1)
19+
20+
queue = deque([N])
21+
dist[N] = 0
22+
ways[N] = 1
23+
24+
while queue:
25+
x = queue.popleft()
26+
27+
for nx in (x - 1, x + 1, x * 2):
28+
# 범위 내
29+
if 0 <= nx <= MAX:
30+
# 아직 방문하지 않은 위치
31+
if dist[nx] == -1:
32+
dist[nx] = dist[x] + 1 # 현재 걸린 시간 +1 초
33+
ways[nx] = ways[x] # 이전 위치에서 오는 방법의 수 가져오기
34+
queue.append(nx)
35+
# 이미 방문했지만, 같은 시간에 다시 도달한 경우
36+
elif dist[nx] == dist[x] + 1:
37+
ways[nx] += ways[x] # 기존 방법 수 + 새로운 경로 수
38+
39+
print(dist[K])
40+
print(ways[K])
41+
42+
"""
43+
풀이2
44+
"""
45+
import sys
46+
from collections import deque
47+
48+
N, K = map(int, sys.stdin.readline().split())
49+
queue = deque()
50+
queue.append(N)
51+
way = [0] * 100001 # 최대 크기
52+
cnt, result = 0, 0
53+
while queue:
54+
a = queue.popleft()
55+
temp = way[a]
56+
if a == K: # 둘이 만났을 때
57+
result = temp # 결과
58+
cnt += 1 # 방문 횟수 +1
59+
continue
60+
61+
for i in [a - 1, a + 1, a * 2]:
62+
if 0 <= i < 100001 and (way[i] == 0 or way[i] == way[a] + 1): # 범위 안에있고 방문하지 않았거나, 다음 방문이 이전 방문+1이면
63+
way[i] = way[a] + 1
64+
queue.append(i)
65+
print(result)
66+
print(cnt)
67+
68+
"""
69+
풀이3
70+
"""
71+
from sys import stdin
72+
73+
input = stdin.readline
74+
from collections import deque
75+
76+
# 수빈 위치, 동생 위치
77+
N, K = map(int, input().split())
78+
79+
MAX_SIZE = 100001
80+
81+
que = deque()
82+
que.append(N)
83+
visited = [-1] * MAX_SIZE
84+
visited[N] = 0
85+
cnt = 0
86+
87+
while que:
88+
# 현 위치
89+
current = que.popleft()
90+
# 도착
91+
if current == K:
92+
cnt += 1
93+
# 이동
94+
for next in [current * 2, current + 1, current - 1]:
95+
# 범위 내
96+
if 0 <= next < MAX_SIZE:
97+
# 첫방문 혹은 방문 시간이 같은 경우가 이미 있음(가장 빠른 시간 방법의 수를 위해)
98+
if visited[next] == -1 or visited[next] >= visited[current] + 1:
99+
visited[next] = visited[current] + 1
100+
que.append(next)
101+
102+
print(visited[K])
103+
print(cnt)
104+
105+
"""
106+
풀이4
107+
"""
108+
import sys
109+
from collections import deque
110+
input = sys.stdin.readline
111+
112+
N, K = map(int, input().split())
113+
if N == K:
114+
print(0)
115+
print(1)
116+
sys.exit()
117+
118+
MAX = 100_000
119+
visited = [False] * (MAX + 1)
120+
visited[N] = True
121+
122+
q = deque([N])
123+
time = 0
124+
ans = 0
125+
found = False
126+
127+
while q and not found:
128+
time += 1
129+
level_size = len(q)
130+
# 이번 레벨에서 새로 방문할 노드들 기록 (방문 표시는 레벨 끝에)
131+
next_level = []
132+
133+
for _ in range(level_size):
134+
x = q.popleft()
135+
for nx in (x - 1, x + 1, x * 2):
136+
if 0 <= nx <= MAX:
137+
if nx == K:
138+
# 동생 위치를 발견할 때마다 카운트
139+
ans += 1
140+
found = True
141+
# 아직 한 번도 다음 레벨에서 enqueue되지 않은 노드만
142+
elif not visited[nx]:
143+
q.append(nx)
144+
next_level.append(nx)
145+
146+
# 이번 레벨의 탐색이 끝난 뒤, 새로 enqueue된 노드들에 한꺼번에 방문 표시
147+
for node in next_level:
148+
visited[node] = True
149+
150+
# 답 출력
151+
print(time)
152+
print(ans)
153+

0 commit comments

Comments
 (0)