๐Ÿ‘ฉโ€๐ŸŽ“๊ณต๋ถ€ - 2024.02.21 ์ฝ”๋”ฉ ๋ฌธ์ œํ’€์ด

์œ ๋ น๊ฐœยท2024๋…„ 2์›” 21์ผ
0

PS-์•Œ๊ณ ๋ฆฌ์ฆ˜2

๋ชฉ๋ก ๋ณด๊ธฐ
33/34
post-thumbnail

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ

DFS๋กœ ํ’€๋‹ค๊ฐ€ ํ•œ์ฐธ ํ•ด๋งธ์Šต๋‹ˆ๋‹ค... ์‹ฌ์ง€์–ด ์˜ˆ์ „์— ์œ ์‚ฌ๋ฌธ์ œ ํ•œ๋ฒˆ ํ’€์–ด๋ดค๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ...
์–ด์จ‹๋“  ์ด ๋ฌธ์ œ์˜ ์Ÿ์ ์€ BFS๋กœ level(depth)๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€ ์—†๋Š”๊ฐ€ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋…ธ๋“œ์˜ ๊ฐ„์„ ์ด 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ์—๋Š” DFS๋กœ ๋…ธ๋“œ์˜ level์„ ๊ตฌํ•˜๊ธฐ ๋งค์šฐ๋งค์šฐ๋งค์šฐ ์–ด๋ ต๊ธฐ๋•Œ๋ฌธ์— BFS๋กœ ๋ ˆ๋ฒจ์„ ๊ตฌํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

from collections import deque
import sys

์‹œ๊ฐ„์ดˆ๊ณผ ๋ฐฉ์ง€์šฉ์œผ๋กœ sysinput ๋ฐ›์•„์„œ

def solution(n, edge):
    input = sys.stdin.readline
    

solution ํ•จ์ˆ˜ ๋‚ด์— ๋„ฃ์–ด์ค์‹œ๋‹ค.

    def bfs(n):
        level = 1
        que.append(n)
        visited[n] = 1

๋จผ์ € BFS ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ• ๊ป๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋ ˆ๋ฒจ 0์€ ๋”ฐ๋กœ ์ง€์ •ํ•ด์ค„๊บผ๊ณ  ๋ ˆ๋ฒจ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ์‹œ๋‹ค.
์ง€๊ธˆ ๋ง‰ ๋“ค์–ด์˜จ ๋…ธ๋“œ 1์€ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ํ•ด์ฃผ๊ณ  que์— ๋„ฃ์–ด์ค์‹œ๋‹ค.

        while que:
            for i in range(len(que)):
                a = que.popleft()

BFS level์ฒ˜๋ฆฌ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. BFS๋ฅผ ๋”ฑ que๊ฐ’๋งŒํผ๋งŒ ๋Œ๋ฆฌ๋ฉด ํ•ด๋‹น level๊ฐ’๋งŒํผ๋งŒ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•œ ์ƒ˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— BFS์—์„œ level์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ฑด ์ œ ์˜ˆ์ „ ํฌ์ŠคํŒ… ์ฒจ๋ถ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
https://velog.io/@ghost_dog/%EA%B3%B5%EB%B6%80-2024.01.19-%EC%98%A4%EB%8A%98%EC%9D%98-%EB%B0%B1%EC%A4%80-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4

                for i in range(len(graph[a])):
                    if not visited[graph[a][i]]:
                        visited[graph[a][i]] = 1
                        que.append(graph[a][i])

ํ˜„์žฌ ํƒ์ƒ‰์ค‘์ธ ๋…ธ๋“œ๋ฅผ ์ธ๋ฑ์Šค ์ฐจ์›์œผ๋กœ ์ ‘๊ทผํ•˜์—ฌ graph[๋…ธ๋“œ] = ์—ฐ๊ฒฐ๋œ๋…ธ๋“œ ํ˜•์‹์œผ๋กœ ์งค๊ป๋‹ˆ๋‹ค.
๋งŒ์•ฝ ํƒ์ƒ‰์ค‘์ธ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ค‘ ์•„์ง ํƒ์ƒ‰์„ ์•ˆํ•œ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ  que์— ์ถ”๊ฐ€ํ•˜์—ฌ ํƒ์ƒ‰ ์˜ˆ๋น„ํ›„๋ณด๋กœ ์ง€์ •ํ•ฉ์‹œ๋‹ค.

                        ans[graph[a][i]] = level
                        print(graph[a][i],level)
            level += 1

ans๋ผ๋Š” ๋ฆฌ์ŠคํŠธ์— ํ•ด๋‹น ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ฉด level์„ ํ‘œ์‹œํ•˜๋„๋ก ์ฝ”๋”ฉํ•ด์ค์‹œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  que์— ํ•ด๋‹นํ•˜๋Š” ๊ฑธ ๋‹ค ๋Œ์•˜์œผ๋ฉด (ํ˜„์žฌ level์ด ๋๋‚ฌ์œผ๋ฉด) level์„ 1 ์˜ฌ๋ ค์ฃผ๋„๋ก ํ•ฉ์‹œ๋‹ค.

    graph = [[] for _ in range(n+1)]
    while edge:
        [x,y] = edge.pop() 
        graph[x].append(y)
        graph[y].append(x)

์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ”ผํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
์›๋ž˜ ์ €๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์งค ๋•Œ ์Šต๊ด€์ ์œผ๋กœ

    graph = [[0]*(n+1) for _ in range(n+1)]
    while edge:
        [x,y] = edge.pop() 
        graph[x][y] = graph[y][x] = 1

๋กœ ์ž‘์„ฑํ–ˆ์—ˆ๋Š”๋ฐ ์ด๋Ÿฌ๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™์€ ํ•˜๋‚˜ DFS๋Š” ๋ฌผ๋ก ์ด๊ณ  BFS์—์„œ๊นŒ์ง€๋„ [0]์ด ์“ธ๋ฐ์—†๋Š” ๊ณต๊ฐ„์„ ์žก์•„๋จน์–ด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œจ๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ [0]์œผ๋กœ ์„ ์–ธํ•˜๊ธฐ๋ณด๋‹จ ์•„์˜ˆ ๋นˆ ๋ฆฌ์ŠคํŠธ์— ์ธ๋ฑ์Šค๋งŒ ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๊ณ  ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์ ‘๊ทผํ•˜๋ฉด value ๊ฐ’์œผ๋กœ ๊ทธ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋งŒ ํ‘œ์‹œํ•˜๊ฒŒ๋” ์ฝ”๋”ฉํ–ˆ์”๋‹ˆ๋‹ค.

    visited = [0]*(n+1)
    que = deque([])
    ans = [0]*(n+1)
    ans[1] = 0
    bfs(1)

๋ฐฉ๋ฌธ๋ฐฐ์—ด ์ดˆ๊ธฐํ™”, que์„ ์–ธ, ans ์„ ์–ธ ๋“ฑ์„ ํ•ด์ฃผ๊ณ  ๋งจ ์ฒซ ๋…ธ๋“œ์ธ 1์€ level 0์œผ๋กœ ์„ค์ •ํ•ด์ค์‹œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  1์„ ์‹œ์ž‘์œผ๋กœ bfs๋ฅผ ๋Œ๋ฆฌ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    return ans.count(max(ans))

๋งˆ์ง€๋ง‰์œผ๋กœ level์ด ๊ฐ€์žฅ ํฐ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ ํ–ˆ์œผ๋ฏ€๋กœ max(ans)๋กœ ๊ฐ€์žฅ ํฐ ๋ ˆ๋ฒจ์„ ๊ตฌํ•ด ans์— ์–ผ๋งŒํผ ์žˆ๋Š”์ง€ countํ•ด์ค์‹œ๋‹ค.



ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ์Šคํ‚ฌํŠธ๋ฆฌ

์†Œ๋งˆ 1,2๋ฒˆ์— ๊ตฌํ˜„ ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜จ๋‹ค๊ธธ๋ž˜ ๊ตฌํ˜„ ๋ฌธ์ œ ์—ฐ์Šต๊ฒธ ํ’€์–ด๋ดค์Šต๋‹ˆ๋‹ค.

์Šคํ‚ฌ๊ณผ ์Šคํ‚ฌํŠธ๋ฆฌ๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ์Šคํ‚ฌ์ด๋ผ๋Š” ๋ฆฌ์ŠคํŠธ์— A,B,C๊ฐ€ ์žˆ์œผ๋ฉด ์Šคํ‚ฌํŠธ๋ฆฌ๋ผ๋Š” ์›์†Œ๊ฐ’ ์ˆœ์„œ๋Š” ๋ฌด์กฐ๊ฑด A๊ฐ€ ๋จผ์ €, ๊ทธ๋‹ค์Œ B, ๊ทธ๋‹ค์Œ C๊ฐ€ ์™€์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ญ๊ฐ€ ์ค‘๊ฐ„์— ๊ปด์žˆ์–ด๋„ ํฌ๊ฒŒ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์€ ์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ์— ๋น ์ง„ ์›์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด A->K(์•„๋ฌด๊ฑฐ๋‚˜)->C๋ผ๋ฉด A๋‹ค์Œ์— ์™€์•ผ ํ•  B๊ฐ€ ๋น ์ ธ์žˆ์œผ๋ฏ€๋กœ ์Šคํ‚ฌํŠธ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    ans = 0
    skill = list(skill)

์ผ๋‹จ ans๋ฅผ 0์œผ๋กœ ์„ ์–ธํ•˜๊ณ  skill์„ list๋กœ์จ ํ™œ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋ถ„๋ฆฌํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

    for i in range(len(skill_trees)):
        tmp = -1
        boolean = False

์ด์ œ ์Šคํ‚ฌ ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ์™€ ๋Œ€์กฐํ•ด์ค„ ๊ฒ๋‹ˆ๋‹ค. tmp๊ฐ’์€ ๊ธฐ์žฌํ•˜๊ฒ ์ง€๋งŒ ํ•ด๋‹น ์Šคํ‚ฌ ํŠธ๋ฆฌ ์–ด๋Š ์ธ๋ฑ์Šค์— ์Šคํ‚ฌ์ด ์œ„์น˜ํ•˜๋Š”๊ฐ€๋ฅผ ๊ธฐ์žฌํ•ด์ค„ ๊ฒ๋‹ˆ๋‹ค. ๊ฐ’์„ ์ž‘์œผ๋ฉด~ ์ด๋ผ๋Š” ์กฐ๊ฑด์œผ๋กœ ๋Œ€์กฐํ• ๊ฑฐ๋ผ -1๋กœ ์ดˆ๊ธฐํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

        for k in range(len(skill)):
            if boolean == True:
                break

์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ์™€ ๋Œ€์กฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. boolean๊ฐ’์ด true๋ฉด ์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ ์ˆœ์„œ์— ๋งž์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ๋ฃจํ”„๋ฅผ ๊นจ๊ฒ ์Šต๋‹ˆ๋‹ค.

            elif skill[k] not in skill_trees[i]:
                tmp = 100
                continue

์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ๊ฐ€ A->B->C ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์Šคํ‚ฌํŠธ๋ฆฌ๊ฐ€ A->K->C๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. A์กฐ์‚ฌ๋Š” ๋ฌด๋‚œํžˆ ๋„˜์–ด๊ฐ”๋Š”๋ฐ ์Šคํ‚ฌํŠธ๋ฆฌ์— B๋ผ๋Š” ์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—†๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฒ„๋ฆฌ๋ฉด B์ดํ›„์˜ ์–ด๋–ค ์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ๋„ ์Šคํ‚ฌํŠธ๋ฆฌ์— ์กด์žฌํ•ด์„œ๋Š” ์•ˆ๋˜๋ฏ€๋กœ tmp์— 100์ด๋ผ๋Š” ๊ณ ๊ฐ’์„ ๋Œ€์ž…ํ•ด ๋ฌด์Šจ ๊ฐ’์ด๋“  ํŠ•๊ฒจ๋ฒ„๋ฆฌ๋„๋ก ํ•ฉ์‹œ๋‹ค.

            elif skill_trees[i].index(skill[k]) < tmp:
                boolean = True
                continue

๋งŒ์•ฝ ํ˜„์žฌ ์กฐ์‚ฌ์ค‘์ธ ์Šคํ‚ฌ ํŠธ๋ฆฌ ๋‚ด๋ถ€์˜ ์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ ์œ„์น˜๊ฐ€ ์ด์ „์— ์กฐ์‚ฌํ•œ ์Šคํ‚ฌ ํŠธ๋ฆฌ ๋‚ด๋ถ€์˜ ์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ ์œ„์น˜๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ ์ˆœ์„œ์— ๋งž์ง€ ์•Š์œผ๋ฏ€๋กœ boolean = True๋ฅผ ์œ ๋„ํ•ด์„œ ์ตœ์ข… ๋‹ต์„ ์˜ฌ๋ฆฌ์ง€ ๋ชปํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค.

            tmp = skill_trees[i].index(skill[k])

๋‹ค์Œ ์Šคํ‚ฌ ๋ฆฌ์ŠคํŠธ์™€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ tmp๋ฅผ ์ €์žฅํ•ด์ค์‹œ๋‹ค.

        if boolean == False:
            ans += 1
    return (ans)

์œ„ ๊ณผ์ •์„ ๊ฑธ์ณค์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  boolean๊ฐ’์ด False๊ฐ€ ๋‚˜์™”๋‹ค๋ฉด ์ตœ์ข… ๋‹ต + 1์„ ํ•ด์ฃผ๊ณ  return ํ•ด์ค์‹œ๋‹ค.



profile
ํ•œ๋ฆผ๋Œ€ํ•™๊ต ์ •๋ณด๊ณผํ•™๋Œ€ 2ํ•™๋…„ ์žฌํ•™์ค‘ / ์œก๊ตฐ ์ •๋ณด๋ณดํ˜ธ๋ณ‘ 22-2๊ธฐ

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