https://school.programmers.co.kr/learn/courses/30/lessons/131130
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
โ๏ธ ๋ฌธ์ ์์ฝ
์ฃผ์ด์ง ๊ท์น์ ๋ฐ๋ผ ๊ฒ์์ ํ์ ๋, ์ด ๊ฒ์์์ ์ป์ ์ ์๋ ์ต๊ณ ์ ์๋ฅผ ๊ตฌํ๋ผ.
๊ฒ์ ๊ท์น
- ์ ์ ๋ฐฐ์ด์ธ cards๊ฐ ์ฃผ์ด์ง๋ค.
- cards์ ๊ฐ ์ซ์๋ฅผ ์์์ ๋ฃ๋๋ค. (๊ฐ ์์์๋ 1๋ฒ๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๋ฒํธ๋ฅผ ๋ถ์ธ๋ค.)
- ์์์ ์์ ํ๋๋ฅผ ์ ํํ์ฌ ์์ ์์ ์๋ ์ซ์ ์นด๋๋ฅผ ํ์ธํ๋ค.
- ๋ค์์ผ๋ก ํ์ธํ ์ซ์ ์นด๋์ ์ ํ ๋ฒํธ์ ํด๋นํ๋ ์์๋ฅผ ์ด์ด ์์ ์๋ ์ซ์ ์นด๋๋ฅผ ํ์ธํ๋ค.
- ๋ง์ฐฌ๊ฐ์ง๋ก ์ซ์ ์นด๋์ ์ ํ ๋ฒํธ์ ํด๋นํ๋ ์์๋ฅผ ์ด์ด๊ฐ๋ฉฐ, ์ด์ด์ผ ํ๋ ์์๊ฐ ์ด๋ฏธ ์ด๋ ค์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- ์ฌ๊ธฐ๊น์ง ํ ํด์ด ๋๋ฌ๋ค. ์ด๋ ๊ฒ ์ฐ ์์๋ค์ 1๋ฒ ๊ทธ๋ฃน์ด๋ค.
- ๋ง์ฝ 1๋ฒ ์์ ๊ทธ๋ฃน์ ์ ์ธํ๊ณ ๋จ๋ ์์๊ฐ ์์ผ๋ฉด 0์ ์ผ๋ก ๊ฒ์์ด ์ข ๋ฃ๋๋ค.
- ๊ทธ๊ฒ ์๋๋ผ๋ฉด ๋ค์ ์์์ ์์ ํ๋๋ฅผ ์ ํํ์ฌ ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ์ด๋ ๊ฒ ์ฐ ์์๋ค์ 2๋ฒ ๊ทธ๋ฃน์ด๋ค.
- 1๋ฒ ๊ทธ๋ฃน์ ์ํ ์์์ ์์ 2๋ฒ ๊ทธ๋ฃน์ ์ํ ์์์ ์๋ฅผ ๊ณฑํ ๊ฐ์ด ๊ฒ์์ ์ ์์ด๋ค.
๐ช ๋์ ํ์ด
์ฃผ์ด์ง cards๋ก ๋์ฌ ์ ์๋ ๋ชจ๋ ๊ทธ๋ฃน์ ๋ฏธ๋ฆฌ ๊ตฌํด๋์ โ๏ธ
ํ ์นด๋๋ฅผ ์ ํํ ๋ค ๊ณ์ํด์ ์ ํ ์๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ๊ทธ๋ฃน์ ๊ตฌ์ฑํ ๊ฑด๋ฐ, ์ด๋ ๋ ๊ฐ์ง๋ฅผ ํด์ผํ๋ค.
1. ๊ทธ๋ฃน์ ๊ตฌ์ฑํ๊ณ ์๋ ์นด๋์ ์๋ฅผ 1์ฉ ์ฆ๊ฐํ๋ค. (cnt += 1)
2. ์ ํํ ์นด๋๋ ๋ฐฉ๋ฌธ์ ์ฒดํฌ๋ฅผ ํ๋ค. (visited[i] = 1)
๋ฐฉ๋ฌธํ ์นด๋๋ฅผ ๋ ๋ฐฉ๋ฌธํ์ ๋ ํ๋์ ๊ทธ๋ฃน์ด ๊ตฌ์ฑ๋ ๊ฒ์ด๋ค.
์ด๋, ๊ทธ๋ฃน์ ์ํ ์นด๋(=์์)์ ์์ธ cnt ๋ณ์๋ฅผ ๋ณ๋์ ๋ฆฌ์คํธ(boxes)์ ๋ด์๋๋ค.
๋ชจ๋ cards๋ฅผ ๋ฐฉ๋ฌธํ๋ค๋ฉด,
boxes ๋ฆฌ์คํธ๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ์ฌ ๊ฐ์ฅ ํฐ ์์์ ๋ ๋ฒ์งธ๋ก ํฐ ์์์ ๊ณฑ์ธ boxes[0] * boxes[1]์ ๋ฐํํ๋ค.
def solution(cards):
n = len(cards)
visited = [0] * n
boxes = [] # ๋์ฌ ์ ์๋ ๋ชจ๋ ๊ทธ๋ฃน์ ๋ํด ๊ตฌ์ฑํ๊ณ ์๋ ๋ฐ์ค ์๋ฅผ ์ ์ฅํด๋ ๋ฆฌ์คํธ
for i in range(n):
cnt = 0
while visited[i] == 0:
visited[i] = 1 # ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
idx = cards[i] - 1 # ๋ค์์ ์ด ์นด๋
i = idx # i ๊ฐฑ์
cnt += 1 # ๊ทธ๋ฃน์ ๊ตฌ์ฑํ๋ ๋ฐ์ค ์ 1 ์ฆ๊ฐ
if cnt != 0:
boxes.append(cnt) # ๊ทธ๋ฃน์ ๊ตฌ์ฑํ๋ ๋ฐ์ค ์ ์ ์ฅ
if len(boxes) < 2:
return 0
boxes.sort(reverse=True)
return boxes[0] * boxes[1]
๊ฐ ๊ทธ๋ฃน์ ๊ตฌ์ฑํ๋ ์ฐ์ฐ์, ๋ชจ๋ ์นด๋๋ฅผ ํ ๋ฒ์ฉ ์ํํ๋ฏ๋ก O(n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
boxes ๋ฆฌ์คํธ๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ์ฐ์ฐ์ O(n log n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๋ฐ๋ผ์ ์ ์ฒด ํจ์์ ์๊ฐ๋ณต์ก๋๋ O(n log n)์ด๋ฉฐ, ๋ฌธ์ ์์ cards์ ์ต๋ ๊ธธ์ด(=n)๋ 100์ด๋ฏ๋ก ์ํธํ๋ค.
๐ค ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ํ๊ตฌํด๋ณด๊ธฐ
def solution(cards):
cards = [(x-1) for x in cards] # ์ธ๋ฑ์ค๋ก ๋ง์ถ๊ธฐ
groups = [] # ๊ฐ ์์ ๊ทธ๋ฃน์ ์ํ ์นด๋ ์
visited = [0] * len(cards) # ๊ฐ ์นด๋๋ค์ด ๋ฝํ ์นด๋์ธ์ง
for x in cards:
if visited[x]:
continue
tmp = [] # โ
ํ ํด์ ๋ฝ์ ์นด๋ ๊ทธ๋ฃน๋ค ์์ ์ ์ฅ
while x not in tmp:
tmp.append(x) # ์นด๋ ๋ฝ์
visited[x] = 1 # ๋ฐฉ๋ฌธ ์ฒดํฌ
x = cards[x] # ๋ค์์ ๋ฝ์ ์นด๋ ๊ฐฑ์
groups.append(len(tmp)) # ๋ช ๊ฐ์ ์นด๋๊ฐ ๋ฝํ๋์ง groups์ ์ถ๊ฐ
if len(groups) == 1:
return 0
groups.sort(reverse=True)
return groups[0] * groups[1]
๐ ์ฐธ๊ณ ์๋ฃ
[ํ๋ก๊ทธ๋๋จธ์ค] ํผ์ ๋๊ธฐ์ ๋ฌ์ธ
'๐ซ ETC > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ณผ์ ์งํํ๊ธฐ (0) | 2023.09.27 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ์์ (0) | 2023.09.25 |
[ํ๋ก๊ทธ๋๋จธ์ค] [1์ฐจ] ์ ํ๋ฒ์ค (0) | 2023.09.23 |
[BOJ] 3460. ์ด์ง์ (0) | 2023.09.22 |
[BOJ] 2501. ์ฝ์ ๊ตฌํ๊ธฐ (0) | 2023.09.20 |