๐Ÿ‘ฉโ€๐ŸŽ“๊ณต๋ถ€ - 2024.01.22 ์˜ค๋Š˜์˜ ๋ฐฑ์ค€ ๋ฌธ์ œํ’€์ด

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

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

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

13265๋ฒˆ - ์ƒ‰์น ํ•˜๊ธฐ

ํŠธ๋ฆฌ๊ฐ€ ํ•˜๋‚˜ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ด ํŠธ๋ฆฌ๋ฅผ ๋‘ ๊ฐ€์ง€ ์ƒ‰์œผ๋กœ ์ƒ‰์น ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌป๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
๋‹ค๋งŒ, ์ด์–ด์ง„ ๋…ธ๋“œ๋ผ๋ฆฌ๋Š” ๊ฐ™์€ ์ƒ‰์„ ๋จ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


์ ‘๊ทผ

์ผ๋‹จ ๋‹จ์ˆœํžˆ ๊ตฌํ˜„ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ 
๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ์ด์ง„ ํŠธ๋ฆฌ๋กœ์จ ์ทจ๊ธ‰ํ•˜์—ฌ ์ƒ๊ฐํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ ˆ๋ฒจ 1์—์„œ๋Š” ๋นจ๊ฐ„์ƒ‰, ๋ ˆ๋ฒจ 2์—์„œ๋Š” ํฐ์ƒ‰, ๋ ˆ๋ฒจ 3์—์„œ๋Š” ๋‹ค์‹œ ๋นจ๊ฐ„์ƒ‰ ... ์ด๋Ÿฐ์”ฉ์œผ๋กœ ํ•˜์—ฌ
๋งŒ์•ฝ ํ˜„์žฌ ํƒ์ƒ‰์ค‘์ธ ๋…ธ๋“œ์™€ ํƒ์ƒ‰ํ•  ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ ์ด์–ด์ ธ์žˆ๋Š”๋ฐ ๊ฐ™์€ ์ƒ‰์„ ๋ˆ๋‹ค, ์ด๋Ÿฌ๋ฉด ๋‘ ๊ฐ€์ง€ ์ƒ‰์œผ๋กœ ์น ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋งŒ์•ฝ ์•„๋‹ˆ๋ผ๋ฉด ๋‘ ๊ฐ€์ง€ ์ƒ‰์œผ๋กœ ์น ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ ๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ ค๋ณด๋ฉด ์ด๋Ÿฐ ๋Š๋‚Œ์ด์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค...


์„ ์–ธ


t = int(input())
que = deque()

for _ in range(t):
    ans = []
    que.clear()
    a,b = map(int,input().split())

์ผ๋‹จ ํŠธ๋ฆฌ๋ฅผ t๋งŒํผ ๋ฐ›๊ณ  BFS ์‚ฌ์šฉ์„ ์œ„ํ•ด que๋ฅผ ๋ฐ›์•„์ค๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  a,b๋กœ ํŠธ๋ฆฌ๋ฅผ ๋ฐ›์•„์ฃผ๊ธฐ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. que๋ฅผ ๋น„์šฐ๋Š” ์ด์œ ๋Š” ์ด๋”ฐ ์ƒ์„ธํžˆ ์„œ์ˆ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

    graph = [[0]*(a+1) for _ in range(a+1)]
    visited = [0]*(a+1)

๊ทธ๋ž˜ํ”„์™€ ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ์„ ์–ธํ•˜๊ณ 

    for _ in range(b):
        c,d = map(int,input().split())
        graph[c][d] = graph[d][c] = 1

์ด์ฐจ์›๋ฐฐ์—ด๋กœ c๋…ธ๋“œ์™€ d๋…ธ๋“œ๊ฐ€ ์ด์–ด์กŒ๋‹ค๋Š” ํ˜•์‹์œผ๋กœ ํ‘œํ˜„ํ•ด์ค์‹œ๋‹ค.

    for i in range(1,d+1):
        if not visited[i]:
            ans.append(bfs(i))

๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ์ค‘์— ๋ฐฉ๋ฌธ ์•ˆํ•œ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋…ธ๋“œ๋Š” bfs ํƒ์ƒ‰์„ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.


BFS

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


def bfs(N):
    color = True
    visited[N] = 1
    graph[0][N] = color
    color = False
    que.append(N)

์ด ๋ฌธ์ œ๊ฐ€ ํ’€๋‹ค๋ณด๋‹ˆ ์‹œ๊ฐ„์ œํ•œ์— ์ข€ ๋ฏผ๊ฐํ•œ ์นœ๊ตฌ์—ฌ์„œ sysinput ์„ ์–ธํ•ด์ฃผ๊ณ  ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์–ด์งœํ”ผ ์ƒ‰์€ ๋‘๊ฐ€์ง€๋ฏ€๋กœ True ์™€ False๋กœ ๊ตฌ๋ถ„ํ•ด์ฃผ๊ณ  ์ดˆ๊ธฐ ์ƒ‰๊น”์€ True๋กœ ์ง€์ •ํ•ด์ค€ ๋‹ค์Œ์— ์ดˆ๊ธฐ ์ƒ‰๊น”์„ graph[0]์— ๋„ฃ์–ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค (์–ด์งœํ”ผ ์•ˆ์“ฐ๋Š” ์ž๋ฆฌ, ํ˜•์‹์ƒ ์ธ๋ฑ์Šค ์ˆซ์ž ๋งž์ถ”๋ ค๊ณ  +1 ์„ ์–ธํ•ด์„œ ๋น„๋Š” ๊ณต๊ฐ„). ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ ๋ ˆ๋ฒจ 0์€ ํƒ์ƒ‰์ด ๋๋‚œ๊ฑฐ๋‹ˆ๊นŒ color๋Š” False๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  (๋‹ค์Œ ํŠธ๋ฆฌ ๋ ˆ๋ฒจ ๋„˜์–ด ๊ฐˆ ๋•Œ ์ƒ‰ ๋ณ€๊ฒฝ) ๋ฐฉ๋ฌธ์—ฌ๋ถ€ 1๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  que์— ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    while que:
        for _ in range(len(que)):
            connect = que.popleft()
            for i in range(len(graph[0])):

์ด๋ฒˆ์—๋„ ์ด์ „ ๋ฌธ์ œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ BFS์˜ level์„ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋ฏ€๋กœ len(que)๋งŒํผ๋งŒ for๋ฌธ์„ ๋Œ๋ ค์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ญ์ƒ ํƒ์ƒ‰ํ•˜๋“ฏ์ด

                if not visited[i] and graph[connect][i] != 0:
                    visited[i] = 1
                    que.append(i)

๋งŒ์•ฝ ๋…ธ๋“œ๋ผ๋ฆฌ ์ด์–ด์ ธ์žˆ๊ณ  ์•„์ง ๋ฐฉ๋ฌธ์„ ์•ˆํ–ˆ์œผ๋ฉด ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ ํ•˜๊ณ  ๋‹ค์Œ ํƒ์ƒ‰๊ตฌ๊ฐ„์œผ๋กœ ์ง€์ •ํ•ด์ค๋‹ˆ๋‹ค.

                    graph[0][i] = color

์ดˆ๋ฐ˜์— ๋ ˆ๋ฒจ 0์—์„œ ์ปฌ๋Ÿฌ๋ฅผ ๋ฐ”๊พธ๊ณ  for๋ฌธ์— ๋“ค์–ด์™”์œผ๋ฏ€๋กœ color ๋ณ€์ˆ˜ ๊ทธ๋Œ€๋กœ graph[0][i], ์ฆ‰ ๋‹ค์Œ ํƒ์ƒ‰์ง€์ ์˜ ์ƒ‰๊น”์„ ๋Œ€์ž…ํ•ด์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

                if graph[connect][i] != 0:
                    if graph[0][i] == graph[0][connect]:
                        return 'impossible'

๋งŒ์•ฝ ํƒ์ƒ‰์„ ํ•  ๋…ธ๋“œ์™€ ํ˜„์žฌ ํƒ์ƒ‰ ์ค‘์ธ ๋…ธ๋“œ์˜ ์ƒ‰๊น”์ด ์ผ์น˜ํ•œ๋‹ค๋ฉด impossible์„ return ํ•ด์ฃผ๋„๋ก ํ•ฉ์‹œ๋‹ค.
0์ด ์•„๋‹ ๋•Œ๋ผ๋Š” ์กฐ๊ฑด์„ ๊ฑด ์ด์œ ๋Š” ๋งŒ์•ฝ graph[0]์˜ ์ธ๋ฑ์Šค์˜ ์ดˆ๊ธฐ๊ฐ’์ด 0์ธ๋ฐ ์ƒ‰๊น”์ด ์•„์˜ˆ ์•ˆ๋“ค์–ด์žˆ๋Š” ์ธ๋ฑ์Šค์™€ ๋งž๋ฌผ๋ฆฌ๊ฒŒ ๋˜๋ฉด ์กฐ๊ฑด์‹์ด ๋ฐœ๋™๋˜๋Š” ๋Œ€์ฐธ์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜๋ฏ€๋กœ ์ง€์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

        if color == False:
            color = True
        elif color == True:
            color = False

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•ด๋‹น ๋ ˆ๋ฒจ์˜ ์ƒ‰๊น”์„ ๋‹ค ์ง€์ •ํ–ˆ์œผ๋ฉด ๋‹ค์Œ ๋ ˆ๋ฒจ๋กœ ๋„˜์–ด๊ฐˆ ๋•Œ ์ƒ‰๊น”์„ ๋ณ€๊ฒฝํ•ด์ค์‹œ๋‹ค.


์ถœ๋ ฅ

    if 'impossible' in ans:
        print('impossible')
    else:
        print('possible')

์ตœ์ข…์ ์œผ๋กœ ans๋ฐฐ์—ด์— impossible์ด ์žˆ๋‹ค๋ฉด ๋ถˆ๊ฐ€๋Šฅ, ์—†๋‹ค๋ฉด ๊ฐ€๋Šฅ์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋๋‚ฉ๋‹ˆ๋‹ค.




์ค‘์š” ์‹ค์ˆ˜

์•„๊นŒ

for _ in range(t):
    ans = []
    que.clear()
    a,b = map(int,input().split())

์—์„œ que.clear()๋ฅผ ํ•ด์ค€ ์ด์œ ๊ฐ€ ์ด๊ฒŒ BFS๊ฐ€ ์‹คํ–‰๋˜๋‹ค๊ฐ€ return์„ ๋งŒ๋‚˜๋ฉด ๊ตณ์ด while์— ์žˆ๋Š” que๊ฐ’์„ ๋‹ค ๋นผ๊ณ  ๋‚˜์˜ฌ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— que์— ๊ฐ’์ด ์ž”๋ฅ˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด ์ƒํƒœ๋กœ que๋ฅผ ์ดˆ๊ธฐํ™”์‹œํ‚ค์ง€ ์•Š๊ณ  ๋‹ค์‹œ BFS๋ฅผ ๋Œ๋ฆฌ๋ฉด ๊ฐ’์ด ์˜ค์—ผ๋˜์„œ ์ด์ƒํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋•Œ๋ฌธ์— ์ƒ๋‹นํžˆ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ•ด์„œ ์•ž์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ๋Š” ์ด๋Ÿฐ ๋ณ€์ˆ˜๋“ค ์œ ์‹ฌํžˆ ์‚ดํŽด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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