๐Ÿ’ซ ETC/Problem Solving

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํ˜ผ์ž ๋†€๊ธฐ์˜ ๋‹ฌ์ธ

ming412 2023. 9. 22. 22:49

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]

 

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํ˜ผ์ž ๋†€๊ธฐ์˜ ๋‹ฌ์ธ