[TIL_Carrotww] 50 - 22/11/11

์œ ํ˜•์„ยท2022๋…„ 11์›” 14์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
60/138
post-thumbnail

๐Ÿ“Carrotww์˜ ์ฝ”๋”ฉ ๊ธฐ๋ก์žฅ

๐Ÿงฒ python algorithm

๐Ÿ” programmers ๋“ฑ๋Œ€ ์–ด์ œ ํ’€๋˜๊ฑฐ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•ด ๋ณด์•˜๋‹ค.
ํ‘ผ ์นœ๊ตฌ์—๊ฒŒ ์ ‘๊ทผ ๋ฐฉ๋ฒ•๋งŒ ๋ฌผ์–ด๋ณด๊ณ  ๊ทธ๊ฑธ ํ† ๋Œ€๋กœ ํ’€์–ด๋ณด์•˜๋‹ค.

  • ๊ธฐ๋ณธ ํ‹€
from collections import defaultdict

def solution(n, lighthouse):
    path_dict = defaultdict(list)

    for a, b in lighthouse:
        path_dict[a].append(b)
        path_dict[b].append(a)

    result = 0

์œ„ ์ฝ”๋“œ๋Š” ์•ˆ ๋ฐ”๋€” ๊ฒƒ ๊ฐ™๋‹ค.
์œ„ ์ฝ”๋“œ๋ฅผ ์‹œ์ž‘์œผ๋กœ ํ•ด๊ฒฐ ๋ฐฉ์‹์€
path_dict ๋”•์…˜์–ด๋ฆฌ๋ฅผ while ๋ฌธ์œผ๋กœ ๋Œ๋ฉฐ ๋์— ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ํ•ด๋‹น ๋…ธ๋“œ์— ๋ฌผ๋ ค์žˆ๋Š” key ๋…ธ๋“œ๋ฅผ path_dict์—์„œ ์ง€์šด ํ›„ ์—ญ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ๋„ ์ง€์›Œ์ค€๋‹ค.
์œ„ ๋ฐฉ๋ฒ•์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ง€์šฐ๊ฒŒ ๋˜์–ด ์žˆ๋‹ค.
3๋ฒˆ์ •๋„ ํ’€์–ด๋ดค๋Š”๋ฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹คใ…œใ…œใ…œใ…œ
๊ทธ๋ž˜๋„ ํ’€์ด๋Š” ์˜ฌ๋ ค ๋ณธ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ
    while path_dict:
        for end_node, side_node in path_dict.items():
            if not side_node:
                del(path_dict[end_node])
            if len(side_node) == 1: # val ์ด ์ค‘์‹ฌ, key ๊ฐ€ ๋ ๋…ธ๋“œ
                del_val = [x for x in path_dict[side_node[0]]] # ๋์— ๋‹ฌ๋ ค์žˆ๋Š”๊ฑฐ ์ €์žฅ
                need_remove_node = side_node[0]
                del(path_dict[side_node[0]]) # ์ค‘์‹ฌ ๋…ธ๋“œ ์ œ๊ฑฐ # 1
                for key, val in path_dict.items():
                    if need_remove_node in val:
                        val.remove(need_remove_node)
                result += 1
                break

์œ„ ๋ฐฉ๋ฒ• ๊ทธ๋Œ€๋กœ ๋ฌด์‹ํ•˜๊ฒŒ ์ง€์šฐ๋ฉฐ ์‹œ์ž‘ํ–ˆ๋‹ค.
RuntimeError: dictionary changed size during iteration
for ๋ฌธ ์•ˆ์—์„œ key๊ฐ’์„ ์ง€์›Œ์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค.

  • ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•
    while path_dict:
        for end_node, side_node in path_dict.items():
            if len(side_node) == 1:
                del_val = [x for x in path_dict[side_node[0]]]
                need_remove_node = side_node[0]
                result += 1
                break
        del_list = []
        if need_remove_node:
            del(path_dict[need_remove_node])
        for key, val in path_dict.items():
            if need_remove_node in val:
                val.remove(need_remove_node)
                if not val:
                    del_list.append(key)
        for dl in del_list:
            del(path_dict[dl])
        need_remove_node = 0

์ด๊ฑด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. ๋‚œ path_dict.items() ๋กœ ๋”•์…˜์–ด๋ฆฌ ์ž์ฒด๋ฅผ for๋ฌธ์œผ๋กœ ๋Œ๋ ค for ๋ฌธ ๋‚ด๋ถ€์—์„œ key๊ฐ’์„ ์ง€์šธ ์ˆ˜ ์—†์–ด ์œ„ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•œ ๊ฒƒ์ด๋‹ค.
ํ•˜์ง€๋งŒ ์“ธ๋ฐ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์€์ง€ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. ใ… ใ… 

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

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