[BOJ] 12851. ์ˆจ๋ฐ”๊ผญ์งˆ2 (๐Ÿฅ‡, BFS/DFS)

lemythe423ยท2023๋…„ 3์›” 15์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
20/133
post-thumbnail

๋ฌธ์ œ

ํ’€์ด1(220ms)

  1. ๊ฐ™์€ ๊นŠ์ด์˜ ํ์— ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ์„ ํ•œ ๋ฒˆ ๋” ์žฌ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  2. visit[x][1]์€ ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋ช‡ ๊ฐ€์ง€์˜€๋Š๋ƒ(๊ฒฝ์šฐ์˜ ์ˆ˜)๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ตœ์ข…์ ์œผ๋กœ ์—ฌ๊ธฐ์— ๋ฐฉ๋ฌธํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ๋”ํ•œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด์•ผ ํ•˜๋ฏ€๋กœ(์ดํ•ฉ) ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณ„์† ๋”ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ด ๋ถ€๋ถ„์„ +1๋กœ ์„ค์ •ํ•ด์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
from collections import deque

def bfs():
    q = deque([N])
    visit[N] = [1, 1]
    while q:
        X = q.popleft()
        if X == K:
            return visit[X][0] -1, visit[X][1]
        for x in (X - 1, X + 1, 2 * X):
            if -1 < x < 100001:
                # print(x, visit[:10])
                if visit[x][0] == 0:
                    visit[x][0] = visit[X][0] + 1
                    visit[x][1] = visit[X][1]
                    q.append(x)
                # ์žฌ๋ฐฉ๋ฌธ ๊ฐ€๋Šฅ: ๊ฐ™์€ ๊นŠ์ด์˜ ํ์—์„œ ๋ฐฉ๋ฌธํ–ˆ์„ ๊ฒฝ์šฐ! visit[X][0]์€ ๊ฒฐ๊ตญ ๊นŠ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ
                elif visit[x][0] == visit[X][0] + 1:					
                	# ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๊ธฐ ์œ„ํ•ด ๊ฑฐ์ณค๋˜ ๊ฒฝ๋กœ๊ฐ€ visit[X][1]์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด ๊ฐ’๋“ค์˜ ์ดํ•ฉ์„ visit[x][1]์— ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณ„์† ๋”ํ•ด์ค˜์•ผ ํ•จ
                    visit[x][1] += visit[X][1]

N, K = map(int, input().split())
visit = [[0, 0] for _ in range(100001)]

print('\n'.join(map(str, bfs())))

ํ’€์ด2(128ms)

  1. N > K ์ธ ๊ฒฝ์šฐ๋Š” ๋ฌด์กฐ๊ฑด -1 ํ•˜๋Š” ๋ฐฉ์‹ ๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๋กœ๋Š” N - K, ๋ฐฉ์‹์€ ํ•˜๋‚˜๋‹ค. N == K ์ธ ๊ฒฝ์šฐ๋„ ๋™์ผํ•˜๋ฏ€๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋กœ ๋นผ์ค€๋‹ค
  2. ๊ฐ™์€ ๊นŠ์ด์— ์œ„์น˜ํ•œ ํ๊ฐ€ ํ•œ ๋ฒˆ ๋Œ๊ณ  ๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋˜๊ณ  ๊ทธ ํ์—์„œ ์–ป์–ด๋‚ธ ๋‹ค์Œ ์œ„์น˜์˜ ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ํ๋กœ ๊ฐฑ์‹ ์‹œ์ผœ์ค€๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐ™์€ ๊นŠ์ด์˜ ํ์—์„œ๋Š” ์žฌ๋ฐฉ๋ฌธ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋Š” ํ๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„ ์ผ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. depth๋Š” ํ๊ฐ€ ํ•œ ๋ฒˆ ๋Œ ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ถ”๊ฐ€ํ•œ๋‹ค.
  3. ์ตœ์ข…์ ์œผ๋กœ depth์™€ visit[K] ๊ฐ’๋งŒ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
def bfs():
    global depth
    start = [N]
    while 1:
        for s in start:
            visit[s] += 1
        if visit[K] != 0:
            break
        depth += 1
        q = []
        for s in start:
            if s - 1 > 0 and visit[s - 1] == 0:
                q.append(s - 1)
            if s + 1 < 100001 and visit[s + 1] == 0:
                q.append(s + 1)
            if s * 2 < 100001 and visit[s * 2] == 0:
                q.append(s * 2)
        start = q

N, K = map(int, input().split())
depth = 0
visit = [0] * 100001

if N >= K:
    print(N - K)
    print(1)
else:
    bfs()
    print(depth)
    print(visit[K])

๋ฐ˜๋ก€

5 237
10
5


1 3
2
2


1 4
2
2


1 7
4
4

ํ›„๊ธฐ

  • ๊ฐ™์€ ๊นŠ์ด์—์„œ๋Š” ์žฌ๋ฐฉ๋ฌธ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์•ผ ํ•จ

ํ’€์ด3(76ms, ๋ณต์Šต)

๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„๊ณผ ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜

๊ธฐ๋ณธ์ ์œผ๋กœ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์€ ํƒ์ƒ‰์˜ ๋ฒ”์œ„๋ฅผ ํ•œ ๋‹จ๊ณ„์”ฉ ๋„“ํ˜€๊ฐ€๋ฉด์„œ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฝ”๋“œ์ƒ์œผ๋กœ๋Š” ํ์—์„œ ์›์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ธฐ์ค€์ด ๋˜๋Š” ๋‹จ๊ณ„(1์ดˆ, ๋˜๋Š” ๊ฑฐ๋ฆฌ1)์— ๋”ฐ๋ผ ํ๊ฐ€ ๋‹จ๊ณ„๋ณ„๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ 1๋ถ€ํ„ฐ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ํ์— ๋‹ด๊ธฐ๊ฒŒ ๋˜๋Š” ์ˆซ์ž๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

"""
1. ์ด์ „์— ํ์— ํ•œ ๋ฒˆ์ด๋ผ๋„ ๋‹ด๊ฒผ๋˜ ์ˆซ์ž๋Š” ์ œ์™ธ(๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ)
2. 0๋ณด๋‹ค ํฌ๊ณ  10๋งŒ๋ณด๋‹ค ์ž‘์€ ์ˆซ์ž๋งŒ 
"""

# 0์ดˆ
queue = [1]

# 1์ดˆ
queue = [2, 2]

# 2์ดˆ
queue = [3, 4, 3, 4]

# 3์ดˆ
queue = [6, 5, 8, 6, 5, 8]

๋งŒ์•ฝ ์ฐพ์œผ๋ ค๋Š” K์˜ ๊ฐ’์ด 8์ด๋ผ๋ฉด ๊ฐ ๋‹จ๊ณ„๋ณ„๋กœ ํ๋ฅผ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ 8์ด๋ž€ ์ˆซ์ž๊ฐ€ ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ์„ ๋•Œ, ๊ทธ๋•Œ์˜ ์ดˆ(๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„)์™€ ํ์— ๋‹ด๊ฒจ์žˆ๋Š” 8์˜ ๊ฐœ์ˆ˜(๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜)๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

๋‹จ, ์ด๋•Œ ์ด๋ฏธ ์ด์ „์— ํ•œ ๋ฒˆ ํ์— ํ•œ ๋ฒˆ์ด๋ผ๋„ ์žˆ์—ˆ๋˜ ๊ฐ’์€ ๋‹ค์Œ ํ์—์„œ ์ค‘๋ณตํƒ์ƒ‰ํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋”ฐ๋กœ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ํ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋„์ค‘์— ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ฒŒ ๋˜๋ฉด ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†๋‹ค. ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜๋Š” ํ˜„์žฌ ๋‹จ๊ณ„์—์„œ ์ค‘๋ณต๋˜๋Š” ์ˆซ์ž๋ฅผ ์ „๋ถ€๋‹ค ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋Š” ๋‹จ๊ณ„๋ณ„ ํ ํƒ์ƒ‰์ด ๋๋‚œ ํ›„ ๋งˆ์ง€๋ง‰์— ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•œ๋‹ค.

1์ดˆ๋ฅผ ๊ธฐ์ค€ ๋‹จ๊ณ„๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๋”ฐ๋กœ ํ์— ์ถ”๊ฐ€ํ•  ํ•„์š” ์—†์ด ํ ํƒ์ƒ‰์ด ๋๋‚ ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค.

# ์ˆจ๋ฐ”๊ผญ์งˆ 2

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

def sol():
    if N >= K:
        return N-K, 1

    queue = [N]
    time = 0
    visited = [0]*100001
    visited[N] = 1
    while queue:
    
        new_q = []
        for x in queue:
            for y in (x-1, x+1, 2*x):
                if y<0 or y>100000 or visited[y]:
                    continue

                new_q.append(y)

        time += 1
        # K๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด ์ตœ๋‹จ ์‹œ๊ฐ„๊ณผ ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜ ์ถœ๋ ฅ
        if K in new_q:
            return time, new_q.count(K)
    	
        # ์ด์ „ ๋‹จ๊ณ„์˜ ํ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
        for x in new_q:
            visited[x] = 1
        queue = new_q[:]

result = sol()
print('\n'.join(map(str, result)))
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€