J1Yun
ZU-TECHLOG
J1Yun
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ“‘ Category (135)
    • Algorithm (61)
      • ๐Ÿ“š Concept (6)
      • ๐Ÿ“˜ Baekjoon Judge (53)
      • ๐Ÿ“— Programmers (2)
    • Computer Science (42)
      • ๐Ÿ”’ Operating System (14)
      • ๐Ÿ“ก Network (15)
      • ๐Ÿ’พ Database (8)
      • ๐Ÿงฉ Design Pattern (4)
      • ๐Ÿ”‘ Security (1)
    • Activities (12)
      • ๐Ÿฆ ๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ 9๊ธฐ (6)
      • ๐Ÿ’ป SW๋งˆ์—์ŠคํŠธ๋กœ 13๊ธฐ (6)
    • Infra (1)
      • โ˜๏ธ AWS (1)
    • Languages (1)
      • ๐Ÿ’™ Python (1)
    • Backend (7)
      • ๐Ÿ”ต Django (4)
      • ๐ŸŸข Node.js (3)
    • Ect. (8)
      • ๐Ÿ’ฌ Talk (0)
      • ๐Ÿ—‚๏ธ ๊ฐœ๋ฐœ์ง๊ตฐ ์ทจ์—… ์ค€๋น„์ž๋ฃŒ (8)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

250x250
hELLO ยท Designed By ์ •์ƒ์šฐ.
J1Yun

ZU-TECHLOG

[BOJ] ๋ฐฑ์ค€ 21609๋ฒˆ ์ƒ์–ด ์ค‘ํ•™๊ต - ํŒŒ์ด์ฌ(Python)
Algorithm/๐Ÿ“˜ Baekjoon Judge

[BOJ] ๋ฐฑ์ค€ 21609๋ฒˆ ์ƒ์–ด ์ค‘ํ•™๊ต - ํŒŒ์ด์ฌ(Python)

728x90

๋ฌธ์ œ

์ƒ์–ด ์ค‘ํ•™๊ต์˜ ์ฝ”๋”ฉ ๋™์•„๋ฆฌ์—์„œ ๊ฒŒ์ž„์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ๊ฒŒ์ž„์€ ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ฒฉ์ž์—์„œ ์ง„ํ–‰๋˜๊ณ , ์ดˆ๊ธฐ์— ๊ฒฉ์ž์˜ ๋ชจ๋“  ์นธ์—๋Š” ๋ธ”๋ก์ด ํ•˜๋‚˜์”ฉ ๋“ค์–ด์žˆ๊ณ , ๋ธ”๋ก์€ ๊ฒ€์€์ƒ‰ ๋ธ”๋ก, ๋ฌด์ง€๊ฐœ ๋ธ”๋ก, ์ผ๋ฐ˜ ๋ธ”๋ก์ด ์žˆ๋‹ค. ์ผ๋ฐ˜ ๋ธ”๋ก์€ M๊ฐ€์ง€ ์ƒ‰์ƒ์ด ์žˆ๊ณ , ์ƒ‰์€ M์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๊ฒ€์€์ƒ‰ ๋ธ”๋ก์€ -1, ๋ฌด์ง€๊ฐœ ๋ธ”๋ก์€ 0์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. (i, j)๋Š” ๊ฒฉ์ž์˜ i๋ฒˆ ํ–‰, j๋ฒˆ ์—ด์„ ์˜๋ฏธํ•˜๊ณ , |r1 - r2| + |c1 - c2| = 1์„ ๋งŒ์กฑํ•˜๋Š” ๋‘ ์นธ (r1, c1)๊ณผ (r2, c2)๋ฅผ ์ธ์ ‘ํ•œ ์นธ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋ธ”๋ก ๊ทธ๋ฃน์€ ์—ฐ๊ฒฐ๋œ ๋ธ”๋ก์˜ ์ง‘ํ•ฉ์ด๋‹ค. ๊ทธ๋ฃน์—๋Š” ์ผ๋ฐ˜ ๋ธ”๋ก์ด ์ ์–ด๋„ ํ•˜๋‚˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ์ผ๋ฐ˜ ๋ธ”๋ก์˜ ์ƒ‰์€ ๋ชจ๋‘ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ๊ฒ€์€์ƒ‰ ๋ธ”๋ก์€ ํฌํ•จ๋˜๋ฉด ์•ˆ ๋˜๊ณ , ๋ฌด์ง€๊ฐœ ๋ธ”๋ก์€ ์–ผ๋งˆ๋‚˜ ๋“ค์–ด์žˆ๋“  ์ƒ๊ด€์—†๋‹ค. ๊ทธ๋ฃน์— ์†ํ•œ ๋ธ”๋ก์˜ ๊ฐœ์ˆ˜๋Š” 2๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•˜๋ฉฐ, ์ž„์˜์˜ ํ•œ ๋ธ”๋ก์—์„œ ๊ทธ๋ฃน์— ์†ํ•œ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ ์ด๋™ํ•ด์„œ ๊ทธ๋ฃน์— ์†ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋ธ”๋ก ๊ทธ๋ฃน์˜ ๊ธฐ์ค€ ๋ธ”๋ก์€ ๋ฌด์ง€๊ฐœ ๋ธ”๋ก์ด ์•„๋‹Œ ๋ธ”๋ก ์ค‘์—์„œ ํ–‰์˜ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๋ธ”๋ก, ๊ทธ๋Ÿฌํ•œ ๋ธ”๋ก์ด ์—ฌ๋Ÿฌ๊ฐœ๋ฉด ์—ด์˜ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๋ธ”๋ก์ด๋‹ค.

์˜ค๋Š˜์€ ์ด ๊ฒŒ์ž„์— ์˜คํ†  ํ”Œ๋ ˆ์ด ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋ ค๊ณ  ํ•œ๋‹ค. ์˜คํ†  ํ”Œ๋ ˆ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์ด ๋ธ”๋ก ๊ทธ๋ฃน์ด ์กด์žฌํ•˜๋Š” ๋™์•ˆ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณต๋˜์–ด์•ผ ํ•œ๋‹ค.

  1. ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ํฐ ๋ธ”๋ก ๊ทธ๋ฃน์„ ์ฐพ๋Š”๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋ธ”๋ก ๊ทธ๋ฃน์ด ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ํฌํ•จ๋œ ๋ฌด์ง€๊ฐœ ๋ธ”๋ก์˜ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ๋ธ”๋ก ๊ทธ๋ฃน, ๊ทธ๋Ÿฌํ•œ ๋ธ”๋ก๋„ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด ๊ธฐ์ค€ ๋ธ”๋ก์˜ ํ–‰์ด ๊ฐ€์žฅ ํฐ ๊ฒƒ์„, ๊ทธ ๊ฒƒ๋„ ์—ฌ๋Ÿฌ๊ฐœ์ด๋ฉด ์—ด์ด ๊ฐ€์žฅ ํฐ ๊ฒƒ์„ ์ฐพ๋Š”๋‹ค.
  2. 1์—์„œ ์ฐพ์€ ๋ธ”๋ก ๊ทธ๋ฃน์˜ ๋ชจ๋“  ๋ธ”๋ก์„ ์ œ๊ฑฐํ•œ๋‹ค. ๋ธ”๋ก ๊ทธ๋ฃน์— ํฌํ•จ๋œ ๋ธ”๋ก์˜ ์ˆ˜๋ฅผ B๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, B2์ ์„ ํš๋“ํ•œ๋‹ค.
  3. ๊ฒฉ์ž์— ์ค‘๋ ฅ์ด ์ž‘์šฉํ•œ๋‹ค.
  4. ๊ฒฉ์ž๊ฐ€ 90๋„ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ๋‹ค.
  5. ๋‹ค์‹œ ๊ฒฉ์ž์— ์ค‘๋ ฅ์ด ์ž‘์šฉํ•œ๋‹ค.

๊ฒฉ์ž์— ์ค‘๋ ฅ์ด ์ž‘์šฉํ•˜๋ฉด ๊ฒ€์€์ƒ‰ ๋ธ”๋ก์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ธ”๋ก์ด ํ–‰์˜ ๋ฒˆํ˜ธ๊ฐ€ ํฐ ์นธ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ์ด๋™์€ ๋‹ค๋ฅธ ๋ธ”๋ก์ด๋‚˜ ๊ฒฉ์ž์˜ ๊ฒฝ๊ณ„๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๊ณ„์† ๋œ๋‹ค.

๋‹ค์Œ์€ N = 5, M = 3์ธ ๊ฒฝ์šฐ์˜ ์˜ˆ์‹œ์ด๋‹ค.

2 2 -1 3 1
3 3 2 0 -1
0 0 0 1 2
-1 3 1 3 2
0 3 2 2 1

์—ฌ๊ธฐ์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ํฐ ๋ธ”๋ก ๊ทธ๋ฃน์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œํ–ˆ๋‹ค.

2 2 -1 3 1
3 3 2 0 -1
0 0 0 1 2
-1 3 1 3 2
0 3 2 2 1

๋ธ”๋ก ๊ทธ๋ฃน์ด ์ œ๊ฑฐ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ•˜๊ณ , ์ ์ˆ˜ 82์ ์„ ํš๋“ํ•œ๋‹ค.

2 2 -1 3 1
    2 0 -1
      1 2
-1   1 3 2
    2 2 1

์ค‘๋ ฅ์ด ์ž‘์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ•œ๋‹ค.

    -1 3 1
      0 -1
2   2 1 2
-1   1 3 2
  2 2 2 1

90๋„ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1 -1 2 2 1
3 0 1 3 2
-1   2 1 2
        2
    2 -1  

๋‹ค์‹œ ์—ฌ๊ธฐ์„œ ์ค‘๋ ฅ์ด ์ž‘์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ•œ๋‹ค.

1 -1      
3   2 2 1
-1   1 3 2
    2 1 2
  0 2 -1 2

์˜คํ†  ํ”Œ๋ ˆ์ด๊ฐ€ ๋ชจ๋‘ ๋๋‚ฌ์„ ๋•Œ ํš๋“ํ•œ ์ ์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ฒฉ์ž ํ•œ ๋ณ€์˜ ํฌ๊ธฐ N, ์ƒ‰์ƒ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฒฉ์ž์˜ ์นธ์— ๋“ค์–ด์žˆ๋Š” ๋ธ”๋ก์˜ ์ •๋ณด๊ฐ€ 1๋ฒˆ ํ–‰๋ถ€ํ„ฐ N๋ฒˆ ํ–‰๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ–‰์— ๋Œ€ํ•œ ์ •๋ณด๋Š” 1์—ด๋ถ€ํ„ฐ N์—ด๊นŒ์ง€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ์นธ์˜ ์ •๋ณด๋Š” -1, 0, M์ดํ•˜์˜ ์ž์—ฐ์ˆ˜๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํš๋“ํ•œ ์ ์ˆ˜์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

https://www.acmicpc.net/problem/21609

 

21609๋ฒˆ: ์ƒ์–ด ์ค‘ํ•™๊ต

์ƒ์–ด ์ค‘ํ•™๊ต์˜ ์ฝ”๋”ฉ ๋™์•„๋ฆฌ์—์„œ ๊ฒŒ์ž„์„ ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ๊ฒŒ์ž„์€ ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ฒฉ์ž์—์„œ ์ง„ํ–‰๋˜๊ณ , ์ดˆ๊ธฐ์— ๊ฒฉ์ž์˜ ๋ชจ๋“  ์นธ์—๋Š” ๋ธ”๋ก์ด ํ•˜๋‚˜์”ฉ ๋“ค์–ด์žˆ๊ณ , ๋ธ”๋ก์€ ๊ฒ€์€์ƒ‰ ๋ธ”๋ก, ๋ฌด์ง€๊ฐœ ๋ธ”๋ก, ์ผ๋ฐ˜ ๋ธ”๋ก

www.acmicpc.net

 

๐Ÿ’ก ํ’€์ด ๋ฐ ์ฝ”๋“œ

from collections import deque

n, m = map(int, input().split())
board = []
for _ in range(n):
    board.append(list(map(int, input().split())))

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

def dfs(x, y, value, visited, visited_now):
    global count_block, count_rainbow

    visited_now[x][y] = 1
    if board[x][y] > 0:
        visited[x][y] = 1
    count_block += 1
    count_rainbow += 1 if board[x][y] == 0 else 0

    for i in range(4):
        nx, ny = x + dx[i], y + dy[i]
        if nx < 0 or nx >= n or ny < 0 or ny >= n or visited[nx][ny] or visited_now[nx][ny]:
            continue
        if board[nx][ny] == value or board[nx][ny] == 0: 
            dfs(nx, ny, value, visited, visited_now)
        

def findMaxBlockGroup():
    global count_block, count_rainbow
    max_block_group = (0, 0, 0, 0)
    visited = [[0]*n for _ in range(n)]

    for i in range(n):
        for j in range(n):
            if board[i][j] > 0 and not visited[i][j]:
                visited_now = [[0]*n for _ in range(n)]
                count_block, count_rainbow = 0, 0

                dfs(i, j, board[i][j], visited, visited_now)
                if count_block >= 2:
                    max_block_group = max(max_block_group, (count_block, count_rainbow, i, j))

    return max_block_group


def removeBlockGroup(x, y):
    queue = deque()
    visited = [[0]*n for _ in range(n)]
    queue.append((x, y))
    value = board[x][y]
    board[x][y] = -2

    while queue:
        x, y = queue.popleft()

        for i in range(4):
            nx, ny = x + dx[i], y + dy[i]
            if nx < 0 or nx >= n or ny < 0 or ny >= n or visited[nx][ny]:
                continue
            if board[nx][ny] == value or board[nx][ny] == 0:
                queue.append((nx, ny))
                board[nx][ny] = -2


def gravity():
    for j in range(n):
        remained = []
        for i in range(n-1, -1, -1):
            if board[i][j] == -1:
                remained = remained + [-2] * (n - i - len(remained) - 1)
            if board[i][j] != -2:
                remained.append(board[i][j])

        remained = remained + [-2] * (n - len(remained))
        for i in range(n-1, -1, -1):
            board[i][j] = remained[n-i-1]


def rotateCounterclockwise():
    return list(map(list, zip(*board)))[::-1]


result = 0
while 1:
    block_size, _, standard_x, standard_y = findMaxBlockGroup()
    if block_size == 0:
        break

    removeBlockGroup(standard_x, standard_y)
    result += block_size**2

    gravity()

    board = rotateCounterclockwise()

    gravity()

print(result)

์š”๊ตฌ์‚ฌํ•ญ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ๊ณ  ์กฐ๊ฑด์„ ํŒŒ์•…ํ•œ ํ›„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค. ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„๋ฅ˜ํ•˜์˜€๋‹ค.

  • findMaxBlockGroup(): dfs๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ํฐ ๋ธ”๋ก ๊ทธ๋ฃน ์ฐพ๊ธฐ
  • removeBlockGroup(): ํ•ด๋‹น ๊ทธ๋ฃน์˜ ๋ชจ๋“  ์š”์†Œ ์‚ญ์ œํ•˜๊ธฐ -> ์ดํ›„ ์ ์ˆ˜ ๊ณ„์‚ฐ
  • gravity(): ์ค‘๋ ฅ ๊ฐ€ํ•˜๊ธฐ
  • rotateCounterclockwise(): ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒฉ์ž ๋Œ๋ฆฌ๊ธฐ
728x90

'Algorithm > ๐Ÿ“˜ Baekjoon Judge' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] ๋ฐฑ์ค€ 21608๋ฒˆ ์ƒ์–ด ์ดˆ๋“ฑํ•™๊ต - ํŒŒ์ด์ฌ(Python)  (0) 2022.10.07
[BOJ] ๋ฐฑ์ค€ 17144๋ฒˆ ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! - ํŒŒ์ด์ฌ(Python)  (0) 2022.08.26
[BOJ] ๋ฐฑ์ค€ 15685๋ฒˆ ๋“œ๋ž˜๊ณค ์ปค๋ธŒ - ํŒŒ์ด์ฌ(Python)  (0) 2022.08.23
[BOJ] ๋ฐฑ์ค€ 2133๋ฒˆ ํƒ€์ผ ์ฑ„์šฐ๊ธฐ - ํŒŒ์ด์ฌ(Python)  (0) 2022.08.18
[BOJ] ๋ฐฑ์ค€ 2294๋ฒˆ ๋™์ „ 2 - ํŒŒ์ด์ฌ(Python)  (0) 2022.08.18
    'Algorithm/๐Ÿ“˜ Baekjoon Judge' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€์ด๋‹ค
    • [BOJ] ๋ฐฑ์ค€ 21608๋ฒˆ ์ƒ์–ด ์ดˆ๋“ฑํ•™๊ต - ํŒŒ์ด์ฌ(Python)
    • [BOJ] ๋ฐฑ์ค€ 17144๋ฒˆ ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•! - ํŒŒ์ด์ฌ(Python)
    • [BOJ] ๋ฐฑ์ค€ 15685๋ฒˆ ๋“œ๋ž˜๊ณค ์ปค๋ธŒ - ํŒŒ์ด์ฌ(Python)
    • [BOJ] ๋ฐฑ์ค€ 2133๋ฒˆ ํƒ€์ผ ์ฑ„์šฐ๊ธฐ - ํŒŒ์ด์ฌ(Python)
    J1Yun
    J1Yun
    ๊ฐœ๋ฐœ ๊ด€๋ จ ๊ธฐ์ˆ  ๋ฐ ๊ณต๋ถ€ ๋‚ด์šฉ ๊ธฐ๋ก์žฅ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”