Algorithm Problem/Python

[python] SWEA - 1861. μ •μ‚¬κ°ν˜• λ°©

deo2kim 2020. 8. 14. 08:23
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

1. D4 | DFS

2. μ„ νƒν•œ μˆ«μžμ™€ +1, -1둜 연결될 수 μžˆλŠ” ꡬ간을 μ°ΎλŠ” 방법을 μ‚¬μš©

3. 처음 숫자λ₯Ό μ„ νƒν•˜κ³  κ·Έ μˆ«μžλ³΄λ‹€ 값이 1이 큰 숫자λ₯Ό 계속 μ°ΎλŠ”λ‹€

4. κ·Έ μˆ«μžλ³΄λ‹€ 값이 1이 μž‘μ€ μˆ«μžλ„ 계속 μ°ΎλŠ”λ‹€.

5. 찾은 μž‘μ€ 숫자 ~ 큰 숫자의 λ²”μœ„κ°€ ν•˜λ‚˜μ˜ ꡬ간이 λœλ‹€.

6. 값을 λ‹€λ₯Έ 숫자(ex. -10)으둜 λ°”κΏ”μ€˜μ„œ ν•˜λ‚˜μ˜ ꡬ간을 μ—¬λŸ¬λ²ˆ νƒμƒ‰ν•˜μ§€ μ•Šκ²Œ ν•œλ‹€.

7. λͺ¨λ“  ꡬ간듀을 κ΅¬ν•˜κ³  κ΅¬κ°„μ˜ 길이가 κ°€μž₯ κΈ΄ ꡬ간을 선택. ꡬ간이 μ—¬λŸ¬κ°œλΌλ©΄ μ‹œμž‘μ μ΄ κ°€μž₯ μž‘μ€ 숫자λ₯Ό μ„ νƒν•œλ‹€.

 (cnt_listλŠ” μ‹œμž‘μ μ„ 인덱슀둜 ν•˜κ³  값을 κ΅¬κ°„μ˜ 길이둜 ν•˜λŠ” λ¦¬μŠ€νŠΈμ΄λ‹€)

 

πŸ’¨ ν•˜λ‚˜ν•˜λ‚˜ λͺ¨λ“  숫자λ₯Ό 탐색해도 λ˜μ§€λ§Œ 효율이 쒋지 μ•Šμ„ 것 κ°™λ‹€.

 

πŸ’»μ†ŒμŠ€ μ½”λ“œ

 dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]

for tc in range(1, 1+int(input())):
    n = int(input())
    maps = [list(map(int, input().split())) for _ in range(n)]

    cnt_list = [0] * (n ** 2 + 1)

    for i in range(n):
        for j in range(n):
            if maps[i][j] > 0:
                low_stack = [(i, j)]
                low_num = maps[i][j]

                high_num = maps[i][j]
                high_stack = [(i, j)]

                maps[i][j] = -10
                # 큰 숫자 찾기
                while high_stack:
                    x, y = high_stack.pop()
                    for k in range(4):
                        nx = x + dx[k]
                        ny = y + dy[k]
                        if 0<=nx<n and 0<=ny<n:
                            if maps[nx][ny] == high_num + 1:
                                high_stack.append((nx,ny))
                                high_num += 1
                                maps[nx][ny] = -10
                                break
                # μž‘μ€ 숫자 μ°ΎκΈ°
                while low_stack:
                    x, y = low_stack.pop()

                    for k in range(4):
                        nx = x + dx[k]
                        ny = y + dy[k]
                        if 0<=nx<n and 0<=ny<n:
                            if maps[nx][ny] == low_num - 1:
                                low_stack.append((nx,ny))
                                low_num -= 1
                                maps[nx][ny] = -10
                                break

                cnt_list[low_num] = high_num - low_num + 1

    max_cnt = max(cnt_list)
    max_cnt_idx = cnt_list.index(max_cnt)
    print('#{} {} {}'.format(tc, max_cnt_idx, max_cnt))


 

πŸ“•λ¬Έμ œ 확인

좜처: SW Expert Academy

링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LtJYKDzsDFAXc&categoryId=AV5LtJYKDzsDFAXc&categoryType=CODE

 

SW Expert Academy

SW ν”„λ‘œκ·Έλž˜λ° μ—­λŸ‰ 강화에 도움이 λ˜λŠ” λ‹€μ–‘ν•œ ν•™μŠ΅ 컨텐츠λ₯Ό ν™•μΈν•˜μ„Έμš”!

swexpertacademy.com

N2개의 방이 N×Nν˜•νƒœλ‘œ λŠ˜μ–΄μ„œ μžˆλ‹€.

μœ„μ—μ„œ i번째 μ€„μ˜ μ™Όμͺ½μ—μ„œ j번째 λ°©μ—λŠ” 1이상 N2 μ΄ν•˜μ˜ 수 Ai,jκ°€ μ ν˜€ 있으며, 이 μˆ«μžλŠ” λͺ¨λ“  방에 λŒ€ν•΄ μ„œλ‘œ λ‹€λ₯΄λ‹€.

당신이 μ–΄λ–€ 방에 μžˆλ‹€λ©΄, μƒν•˜μ’Œμš°μ— μžˆλŠ” λ‹€λ₯Έ 방으둜 이동할 수 μžˆλ‹€.

λ¬Όλ‘  μ΄λ™ν•˜λ €λŠ” 방이 μ‘΄μž¬ν•΄μ•Ό ν•˜κ³ , μ΄λ™ν•˜λ €λŠ” 방에 적힌 μˆ«μžκ°€ ν˜„μž¬ 방에 적힌 μˆ«μžλ³΄λ‹€ μ •ν™•νžˆ 1 더 컀야 ν•œλ‹€.

처음 μ–΄λ–€ μˆ˜κ°€ 적힌 λ°©μ—μ„œ μžˆμ–΄μ•Ό κ°€μž₯ λ§Žμ€ 개수의 방을 이동할 수 μžˆλŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.


[μž…λ ₯]

첫 번째 쀄에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 수 Tκ°€ 주어진닀.

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫 번째 μ€„μ—λŠ” ν•˜λ‚˜μ˜ μ •μˆ˜ N (1 ≤ N ≤ 103)이 주어진닀.

λ‹€μŒ N개의 μ€„μ—λŠ” i번째 μ€„μ—λŠ” N개의 μ •μˆ˜ Ai, 1, … , Ai, N (1 ≤ Ai, j ≤ N2) 이 곡백 ν•˜λ‚˜λ‘œ κ΅¬λΆ„λ˜μ–΄ 주어진닀.

Ai, jλŠ” λͺ¨λ‘ μ„œλ‘œ λ‹€λ₯Έ μˆ˜μ΄λ‹€.


[좜λ ₯]

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ ‘#x’(xλŠ” ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€ 번호λ₯Ό μ˜λ―Έν•˜λ©° 1λΆ€ν„° μ‹œμž‘ν•œλ‹€)λ₯Ό 좜λ ₯ν•˜κ³ ,

ν•œ 칸을 λ„μš΄ ν›„, μ²˜μŒμ— μΆœλ°œν•΄μ•Ό ν•˜λŠ” λ°© λ²ˆν˜Έμ™€ μ΅œλŒ€ λͺ‡ 개의 방을 이동할 수 μžˆλŠ”μ§€λ₯Ό 곡백으둜 κ΅¬λΆ„ν•˜μ—¬ 좜λ ₯ν•œλ‹€.

이동할 수 μžˆλŠ” 방의 κ°œμˆ˜κ°€ μ΅œλŒ€μΈ 방이 μ—¬λŸΏμ΄λΌλ©΄ κ·Έ μ€‘μ—μ„œ 적힌 μˆ˜κ°€ κ°€μž₯ μž‘μ€ 것을 좜λ ₯ν•œλ‹€.


[예제 풀이]

첫 번째 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” 1 λ˜λŠ” 3이 적힌 곳에 μžˆμ–΄μ•Ό ν•œλ‹€.

두 번째 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” 3 λ˜λŠ” 6이 적힌 곳에 μžˆμ–΄μ•Ό ν•œλ‹€.

λ°˜μ‘ν˜•