-
[Python] ํ๋ก๊ทธ๋๋จธ์ค ๊ฑฐ๋ฆฌ๋๊ธฐ ํ์ธํ๊ธฐ (๊ตฌํ)๐ป Algorithm/Python 2022. 7. 8. 23:46
๐ ๋ฌธ์
๊ฐ๋ฐ์๋ฅผ ํฌ๋งํ๋ ์ฃ ๋ฅด๋๊ฐ ์นด์นด์ค์ ๋ฉด์ ์ ๋ณด๋ฌ ์์ต๋๋ค.
์ฝ๋ก๋ ๋ฐ์ด๋ฌ์ค ๊ฐ์ผ ์๋ฐฉ์ ์ํด ์์์๋ค์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฌ์ ๋๊ธฐ๋ฅผ ํด์ผํ๋๋ฐ ๊ฐ๋ฐ ์ง๊ตฐ ๋ฉด์ ์ธ ๋งํผ ์๋์ ๊ฐ์ ๊ท์น์ผ๋ก ๋๊ธฐ์ค์ ๊ฑฐ๋ฆฌ๋ฅผ ๋๊ณ ์๋๋ก ์๋ดํ๊ณ ์์ต๋๋ค.
- ๋๊ธฐ์ค์ 5๊ฐ์ด๋ฉฐ, ๊ฐ ๋๊ธฐ์ค์ 5x5 ํฌ๊ธฐ์ ๋๋ค.
- ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์ํ์ฌ ์์์๋ค ๋ผ๋ฆฌ๋ ๋งจํดํผ ๊ฑฐ๋ฆฌ1๊ฐ 2 ์ดํ๋ก ์์ง ๋ง์ ์ฃผ์ธ์.
- ๋จ ์์์๊ฐ ์์์๋ ์๋ฆฌ ์ฌ์ด๊ฐ ํํฐ์ ์ผ๋ก ๋งํ ์์ ๊ฒฝ์ฐ์๋ ํ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด,
5๊ฐ์ ๋๊ธฐ์ค์ ๋ณธ ์ฃ ๋ฅด๋๋ ๊ฐ ๋๊ธฐ์ค์์ ์์์๋ค์ด ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์ ๊ธฐํค๊ณ ์๋์ง ์๊ณ ์ถ์ด์ก์ต๋๋ค. ์๋ฆฌ์ ์์์๋ ์์์๋ค์ ์ ๋ณด์ ๋๊ธฐ์ค ๊ตฌ์กฐ๋ฅผ ๋๊ธฐ์ค๋ณ๋ก ๋ด์ 2์ฐจ์ ๋ฌธ์์ด ๋ฐฐ์ด places๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง๋๋ค. ๊ฐ ๋๊ธฐ์ค๋ณ๋ก ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์งํค๊ณ ์์ผ๋ฉด 1์, ํ ๋ช ์ด๋ผ๋ ์งํค์ง ์๊ณ ์์ผ๋ฉด 0์ ๋ฐฐ์ด์ ๋ด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
์ ํ์ฌํญ
places์ ํ ๊ธธ์ด(๋๊ธฐ์ค ๊ฐ์) = 5
- places์ ๊ฐ ํ์ ํ๋์ ๋๊ธฐ์ค ๊ตฌ์กฐ๋ฅผ ๋ํ๋ ๋๋ค.
places์ ์ด ๊ธธ์ด(๋๊ธฐ์ค ์ธ๋ก ๊ธธ์ด) = 5
places์ ์์๋ P,O,X๋ก ์ด๋ฃจ์ด์ง ๋ฌธ์์ด์ ๋๋ค.
- places ์์์ ๊ธธ์ด(๋๊ธฐ์ค ๊ฐ๋ก ๊ธธ์ด) = 5
- P๋ ์์์๊ฐ ์์์๋ ์๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
- O๋ ๋น ํ ์ด๋ธ์ ์๋ฏธํฉ๋๋ค.
- X๋ ํํฐ์ ์ ์๋ฏธํฉ๋๋ค.
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ 5๊ฐ ๋๊ธฐ์ค์ ํฌ๊ธฐ๋ ๋ชจ๋ 5x5 ์ ๋๋ค.
return ๊ฐ ํ์
- 1์ฐจ์ ์ ์ ๋ฐฐ์ด์ 5๊ฐ์ ์์๋ฅผ ๋ด์์ return ํฉ๋๋ค.
- places์ ๋ด๊ฒจ ์๋ 5๊ฐ ๋๊ธฐ์ค์ ์์๋๋ก, ๊ฑฐ๋ฆฌ๋๊ธฐ ์ค์ ์ฌ๋ถ๋ฅผ ์ฐจ๋ก๋๋ก ๋ฐฐ์ด์ ๋ด์ต๋๋ค.
- ๊ฐ ๋๊ธฐ์ค ๋ณ๋ก ๋ชจ๋ ์์์๊ฐ ๊ฑฐ๋ฆฌ๋๊ธฐ๋ฅผ ์งํค๊ณ ์์ผ๋ฉด 1์, ํ ๋ช ์ด๋ผ๋ ์งํค์ง ์๊ณ ์์ผ๋ฉด 0์ ๋ด์ต๋๋ค.
์ ๋ ฅ ์์
[["POOOP", "OXXOX", "OPXPX", "OOXOX", "POXXP"], ["POOPX", "OXPXP", "PXXXO", "OXXXO", "OOOPP"], ["PXOPX", "OXOXP", "OXPOX", "OXXOP", "PXPOX"], ["OOOXX", "XOOOX", "OOOXX", "OXOOX", "OOOOO"], ["PXPXP", "XPXPX", "PXPXP", "XPXPX", "PXPXP"]]
์ถ๋ ฅ ์์
[1, 0, 1, 1, 1]
๐ ํ์ด
๐ฌ Code
from itertools import combinations def solution(places): answer = [] for place in places: pos = [] for i in range(5): for j in range(5): if place[i][j] == 'P': pos.append((i, j)) is_correct = 1 com = list(combinations(pos, 2)) for i in range(len(com)): x1, y1 = com[i][0][0], com[i][0][1] x2, y2 = com[i][1][0], com[i][1][1] dist = abs(x1 - x2) + abs(y1 - y2) if dist <= 2: if x1 == x2 and place[x1][max(y1, y2) - 1] == 'X': continue elif y1 == y2 and place[max(x1, x2) - 1][y1] == 'X': continue elif abs(x1 - x2) == 1 and abs(y1 - y2) == 1: if place[x1][y2] == 'X' and place[x2][y1] == 'X': continue is_correct = 0 break answer.append(is_correct) return answer
๐ก Solution
์ฒ์์ BFS๋ก ํ์๋๋ฐ 30๊ฐ ํ ์คํธ์ผ์ด์ค ์ค 5๊ฐ๋ง ํต๊ณผํ๊ณ ๋๋จธ์ง๋ ๋ฐํ์ ์๋ฌ๊ฐ ๋ ์ ๋น ๋ฅด๊ฒ ํฌ๊ธฐํ๊ณ ์กฐํฉ์ผ๋ก ํ์์ต๋๋ค. ๊ทผ๋ฐ ๋ค๋ฅธ ๋ถ๋ค์ BFS๋ก ์ ํธ์ จ๊ธธ๋ ๊ทธ๋ฅ ๋ด๊ฐ ์ค๊ณ๋ฅผ ์ ๋ชปํ ๊ฒ ๊ฐ์์ ^_ใ ๊ป๊ป ๋์ค์ BFS๋ก ๋ค์ ํ์ด๋ด์ผ์ง
์ฝ๋๋ฅผ ๋ฏ์ด๋ณด๋ฉด
- num: ๋๊ธฐ์ค ์ธ๋ฑ์ค
- pos: P์ ์์น๋ฅผ ๋ด์ ๋ฆฌ์คํธ
- is_correct: ๊ฑฐ๋ฆฌ๋๊ธฐ๊ฐ ์ง์ผ์ก๋์ง๋ฅผ ๋ํ๋ด๋ boolean ๊ฐ
- com: ๋ ๊ฐ์ P ์์น๋ฅผ ์กฐํฉํด์ ๋ฌถ์ด๋ ๋ฆฌ์คํธ
- dist: ๋ P ์ฌ์ด ๊ฑฐ๋ฆฌ
pos = [] # pos: P์ ์์น๋ฅผ ๋ด์ ๋ฆฌ์คํธ for i in range(5): for j in range(5): if place[i][j] == 'P': pos.append((i, j))
P์ ์์น๋ฅผ (x, y) ํํ๋ก pos๋ฆฌ์คํธ์ ์ ์ฅํฉ๋๋ค. ๋์ค์ ๋ชจ๋ P์ ์์น๋ค์ ์กฐํฉํด์ (x1, y1), (x2, y2)์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํจ์ ๋๋ค.
is_correct = 1 # is_correct: ๊ฑฐ๋ฆฌ๋๊ธฐ๊ฐ ์ง์ผ์ก๋์ง๋ฅผ ๋ํ๋ด๋ boolean ๊ฐ com = list(combinations(pos, 2)) # com: ๋ ๊ฐ์ P ์์น๋ฅผ ์กฐํฉ for i in range(len(com)): x1, y1 = com[i][0][0], com[i][0][1] x2, y2 = com[i][1][0], com[i][1][1] dist = abs(x1 - x2) + abs(y1 - y2) # ๋ P ์ฌ์ด ๊ฑฐ๋ฆฌ๊ฐ 2 ์ดํ๋ผ๋ฉด ์ค๊ฐ์ ํํฐ์ ์ด ์๋์ง ๊ฒ์ฌ if dist <= 2: # ๊ฐ๋ก ๊ฒ์ฌ if x1 == x2 and place[x1][max(y1, y2) - 1] == 'X': continue # ์ธ๋ก ๊ฒ์ฌ elif y1 == y2 and place[max(x1, x2) - 1][y1] == 'X': continue # ๋๊ฐ์ ๊ฒ์ฌ elif abs(x1 - x2) == 1 and abs(y1 - y2) == 1: if place[x1][y2] == 'X' and place[x2][y1] == 'X': continue # ์๋ฌด๋ฐ์๋ ํํฐ์ ์ ๋ฐ๊ฒฌํ์ง ๋ชปํ๋ค๋ฉด ๊ฑฐ๋ฆฌ๋๊ธฐ ์คํจ is_correct = 0 break
is_correct๋ฅผ 1๋ก ์ด๊ธฐํํ๋๋ฐ, ๊ฑฐ๋ฆฌ๋๊ธฐ๊ฐ ์ง์ผ์ง์ง ์์ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด 0์ผ๋ก ๋ณ๊ฒฝํ ๊ฒ์ ๋๋ค.
P์ ์์น๋ค์ ์กฐํฉ์ด ๋ด๊ธด com์์ x1, y1, x2, y2๋ฅผ ์ป๊ณ ๊ฑฐ๋ฆฌ dist๋ฅผ ๊ตฌํฉ๋๋ค.
๋ง์ฝ dist๊ฐ 2 ์ดํ๋ผ๋ฉด ์ค๊ฐ์ ํํฐ์ X๊ฐ ์๋์ง ๊ฒ์ฌํฉ๋๋ค.- (0, 0) (0, 1)์ฒ๋ผ dist๊ฐ 1์ธ ๊ฒฝ์ฐ
ํํฐ์ ๊ฒ์ฌ๋ฅผ ํ ํ์๋ ์์ด ๊ฑฐ๋ฆฌ๋๊ธฐ ์คํจ์ด๋ฏ๋ก ๋ชจ๋ if-elif๋ฌธ์ ํต๊ณผํ๊ณ ๋ฐ๋ก is_correct๋ฅผ 0์ผ๋ก ๋ง๋ ๋ค. - (0, 0) (0, 2)์ฒ๋ผ dist๊ฐ 2์ด๊ณ x1 == x2์ธ ๊ฒฝ์ฐ
(0, 1)์ ํํฐ์ ์ด ์์นํ๊ณ ์๋์ง ๊ฒ์ฌ - (1, 0) (3, 0)์ฒ๋ผ dist๊ฐ 2์ด๊ณ y1 == y2์ธ ๊ฒฝ์ฐ
(2, 0)์ ํํฐ์ ์ด ์์นํ๊ณ ์๋์ง ๊ฒ์ฌ - (0, 0) (1, 1)์ฒ๋ผ dist๊ฐ 2์ด๊ณ ๋๊ฐ์ ์ธ ๊ฒฝ์ฐ
(0, 1) (1, 0)์ ํํฐ์ ์ด ๋ชจ๋ ์์นํ๊ณ ์๋์ง ๊ฒ์ฌ
'๐ป Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๋ฐฑ์ค 11265 ๋๋์ง ์๋ ํํฐ (Floyd-Warshall) (0) 2022.07.08 [Python] ๋ฐฑ์ค 18352 ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ (Dijkstra) (0) 2022.07.08 [Python] ๋ฐฑ์ค 11000 ๊ฐ์์ค ๋ฐฐ์ (Heapq) (0) 2022.07.08 [Python] ๋ฐฑ์ค 3107 IPv6 (String) (0) 2022.07.08 [Python] ๋ฐฑ์ค 13022 ๋๋์ ์ฌ๋ฐ๋ฅธ ๋จ์ด (String) (0) 2022.07.08