λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“š Algorithm/Baekjoon

[Baekjoon] λ°±μ€€ 3085 '사탕 κ²Œμž„' λ¬Έμ œν’€μ΄ Python, 파이썬, μ•Œκ³ λ¦¬μ¦˜ 정리

 
πŸ“ 3085 문제 
μƒκ·Όμ΄λŠ” 어렸을 적에 "λ΄„λ³΄λ‹ˆ (Bomboni)" κ²Œμž„μ„ μ¦κ²¨ν–ˆλ‹€.
κ°€μž₯ μ²˜μŒμ— N×N크기에 사탕을 μ±„μ›Œ λ†“λŠ”λ‹€. μ‚¬νƒ•μ˜ 색은 λͺ¨λ‘ 같지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€. μƒκ·Όμ΄λŠ” μ‚¬νƒ•μ˜ 색이 λ‹€λ₯Έ μΈμ ‘ν•œ 두 칸을 κ³ λ₯Έλ‹€. κ·Έ λ‹€μŒ κ³ λ₯Έ 칸에 λ“€μ–΄μžˆλŠ” 사탕을 μ„œλ‘œ κ΅ν™˜ν•œλ‹€. μ΄μ œ, λͺ¨λ‘ 같은 μƒ‰μœΌλ‘œ 이루어져 μžˆλŠ” κ°€μž₯ κΈ΄ 연속 λΆ€λΆ„(ν–‰ λ˜λŠ” μ—΄)을 κ³ λ₯Έ λ‹€μŒ κ·Έ 사탕을 λͺ¨λ‘ λ¨ΉλŠ”λ‹€.
사탕이 μ±„μ›Œμ§„ μƒνƒœκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 상근이가 먹을 수 μžˆλŠ” μ‚¬νƒ•μ˜ μ΅œλŒ€ 개수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯ 

첫째 쀄에 λ³΄λ“œμ˜ 크기 N이 주어진닀. (3 ≤ N ≤ 50)

λ‹€μŒ N개 μ€„μ—λŠ” λ³΄λ“œμ— μ±„μ›Œμ Έ μžˆλŠ” μ‚¬νƒ•μ˜ 색상이 주어진닀. 빨간색은 C, νŒŒλž€μƒ‰μ€ P, μ΄ˆλ‘μƒ‰μ€ Z, λ…Έλž€μƒ‰μ€ Y둜 주어진닀.

μ‚¬νƒ•μ˜ 색이 λ‹€λ₯Έ μΈμ ‘ν•œ 두 칸이 μ‘΄μž¬ν•˜λŠ” μž…λ ₯만 주어진닀.

 

 

좜λ ₯

첫째 쀄에 상근이가 먹을 수 μžˆλŠ” μ‚¬νƒ•μ˜ μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

🧐 풀이

이 λ¬Έμ œλŠ” 완전탐색 λ¬Έμ œμ΄λ‹€. 

μΈμ ‘ν•œ λ‹€λ₯Έ 두 칸을 κ³ λ₯Έ ν›„ μ„œλ‘œ κ΅ν™˜ν•˜λŠ” 쑰건은 파이썬의 swap을 μ‚¬μš©ν•΄μ„œ ν•΄κ²°ν•  수 μžˆλ‹€. 

candy_count() ν•¨μˆ˜

μ²˜μŒμ—λŠ” row와 col의 cnt, maxλ₯Ό λͺ¨λ‘ λ‚˜λˆ μ„œ κ³„μ‚°ν–ˆλŠ”λ° μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜μ™€ ν•©μ³μ„œ κ΅¬ν•˜λŠ” λ°©λ²•μœΌλ‘œ λ°©ν–₯을 ν‹€μ—ˆλ‹€. 

- row와 col의 기쀀을 λ‚˜λˆ  반볡문 μ•ˆμ˜ 쑰건문을 λ‹€λ₯΄κ²Œ μ„€μ •ν•˜κ³  색이 κ°™λ‹€λ©΄ cntλ₯Ό 1μ”© μ¦κ°€μ‹œμΌ°λ‹€.

- max_cnt값을 ꡬ해 λ°˜ν™˜ν•˜λ„λ‘ ν•˜μ˜€λ‹€. 

 

- Nκ³Ό λ³΄λ“œ μ•ˆμ˜ λ¬Έμžλ“€μ„ μž…λ ₯λ°›κ³  쑰건을 λ”°μ Έ swap을 ν•œλ‹€.

- λͺ¨λ‘ 같은 μƒ‰μœΌλ‘œ 이루어져 μžˆλŠ” κ°€μž₯ κΈ΄ 연속 뢀뢄을 κ³ λ₯Έ ν›„ λ‹€μ‹œ λ˜λŒλ¦°λ‹€

- 되돌릴 λ•Œμ—λ„ swap을 μ‚¬μš©ν–ˆλ‹€.

 

 

 

def candy_count() :
    cnt, max_cnt = 1, 1
    res = 0 
    
    for i in range(N) :
        cnt = 1
        #ν–‰ κΈ°μ€€ 탐색
        for j in range(1, N) :
            if board[i][j] == board[i][j-1] :   #μΈμ ‘ν•œ λ³΄λ“œμ™€ 색이 κ°™λ‹€λ©΄ 
                cnt += 1
            else :
                cnt = 1
            max_cnt = max(max_cnt, cnt)

    
        #μ—΄ κΈ°μ€€ 탐색 
        for j in range(1, N) :
            if board[j][i] == board[j-1][i] :   #인접항 λ³΄λ“œμ™€ 색이 κ°™λ‹€λ©΄ 
                cnt += 1
            else :
                cnt = 1
            max_cnt = max(max_cnt, cnt)

    
    res = max(max_cnt, cnt)
    return res   


N = int(input())
board = [list(input()) for _ in range(N)]

res = 1
for i in range(N) :
    for j in range(N-1) :
        if j+1 < N and board[i][j] != board[i][j+1] :
            board[i][j], board[i][j+1] = board[i][j+1], board[i][j]
            res = max(res, candy_count())
            board[i][j], board[i][j+1] = board[i][j+1], board[i][j]
        if i+1 < N and board[i][j] != board[i+1][j] :
            board[i][j], board[i+1][j] = board[i+1][j], board[i][j]
            res = max(res, candy_count())
            board[i][j], board[i+1][j] = board[i+1][j], board[i][j]
            
        
print(res)

 

 

 
728x90