Point ๐Ÿ’ก


1. ๊ฒŒ์ž„ํŒ์„ ์ƒํ•˜์ขŒ์šฐ๋กœ ๊ธฐ์šธ์ด๊ธฐ
2. ์ตœ๋Œ€ 5๋ฒˆ ์›€์ง์—ฌ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๋ธ”๋ก์„ ์–ป๋Š” ๊ฒƒ์ด๋ฏ€๋กœ 5๋ฒˆ ๊ธฐ์šธ์ด๋Š” ๋ฐฉํ–ฅ ์ •ํ•˜๊ธฐ

์ผ๋‹จ, 1๋ฒˆ ๊ณผ์ •์—์„œ ๋จผ์ € ์™ผ์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

์ด๋•Œ, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ‚คํฌ์ธํŠธ๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ์›๋ž˜ ๊ฒŒ์ž„ํŒ์˜ ์›์†Œ์™€ ๋น„๊ตํ•˜๋ฉฐ ํ•˜๋‚˜์”ฉ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๊ทธ ๋’ค์— ์˜ค๋ฅธ์ชฝ, ์œ„์ชฝ, ์•„๋ž˜์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด๋Š” ํ•จ์ˆ˜๋ฅผ ๋‹ค ๋งŒ๋“ค๋ฉด ๋˜๋Š”๋ฐ, ์ด๋•Œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๊ฒŒ์ž„ํŒ ์ž์ฒด๋ฅผ ํšŒ์ „ํ•˜๋ฉด ์™ผ์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด๋Š” ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ์œผ๋กœ ๋ชจ๋‘๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ, ํŒŒ์ด์ฌ์—์„œ๋Š” zip ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

1๋ฒˆ : [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

2๋ฒˆ : [[7, 4, 1], [8, 5, 2], [9, 6, 3]]

-> 1๋ฒˆ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ๋ฆฌ์ŠคํŠธ์˜ 0๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ๋ฆฌ์ŠคํŠธ์˜ 0๋ฒˆ์งธ ์š”์†Œ๊นŒ์ง€ 2๋ฒˆ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ๋ฆฌ์ŠคํŠธ์— ๋“ค์–ด๊ฐ„๋‹ค. ๋‚˜๋จธ์ง€๋„ ๋™์ผํ•˜๋‹ค. 

90๋„๋กœ ํšŒ์ „์„ ํ•ด์•ผํ•  ๋•Œ zip์„ ์ด์šฉํ•ด๋ณด์ž.
turn90 = list(map(list, zip(*board[::-1])))
๋จผ์ €, [[7, 8, 9], [4, 5, 6], [1, 2, 3]] ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , ๊ฐ™์€ ์ธ๋ฑ์Šค์˜ ์š”์†Œ๋“ค๋ผ๋ฆฌ ๋ฌถ๋Š”๋‹ค. ๊ทธ๋Ÿผ 2๋ฒˆ ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.  

๊ทธ ๋‹ค์Œ, 5๋ฒˆ ๊ธฐ์šธ์ด๋Š” ๋ฐฉํ–ฅ์„ ์ •ํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ƒํ•˜์ขŒ์šฐ๋กœ ๊ธฐ์šธ์˜€์„ ๋•Œ๋ฅผ ๋‹ค ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•ด๋ณด๊ณ , ๊ทธ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ๋‚˜์˜ค๋Š” ๋ฐฉํ–ฅ์œผ๋กœ max ๊ฐ’์„ ๊ตฌํ•ด์ค€๋‹ค.

๋‹ต์„ ๋ด๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค. ๊ตฌํ˜„์€ ์–ด๋ ต๋‹ค!

My Solution


import sys
from copy import deepcopy
def rotate(board, dir):
    turn90 = list(map(list, zip(*board[::-1])))
    turn180 = list(map(list, zip(*turn90[::-1])))
    turn270 = list(map(list, zip(*turn180[::-1])))

    if dir == 0:
        return board

    elif dir == 1:
        return turn90

    elif dir == 2:
        return turn180

    else:
        return turn270

def tilt (board, dir):
    rotate_board = rotate(board, dir)
    for i in range(n):
        new_arr = [0 for _ in range(n)]
        idx = 0
        for j in range(n):
            # ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์— ์›์†Œ๊ฐ€ ์—†์œผ๋ฉด ๋’ค์— ๋‚ด์šฉ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
            if rotate_board[i][j] == 0:
                continue
            # ์ƒˆ๋กœ์šด ๋ฐฐ์—ด idx์— ์›์†Œ๊ฐ€ ์—†์œผ๋ฉด, ํ•ด๋‹นํ•˜๋Š” ๋ฐฐ์—ด ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
            if new_arr[idx] == 0:
                new_arr[idx] = rotate_board[i][j]
            # ์ƒˆ๋กœ์šด ๋ฐฐ์—ด idx์— ์›์†Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•ด๋‹นํ•˜๋Š” ๋ฐฐ์—ด๊ฐ’๊ณผ ๊ฐ™์œผ๋ฉด ๋‘๋ฐฐ๋ฅผ ๊ณฑํ•œ๋‹ค.
            elif new_arr[idx] == rotate_board[i][j]:
                new_arr[idx] *= 2
                idx += 1
            # ์ƒˆ๋กœ์šด ๋ฐฐ์—ด idx์— ์›์†Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•ด๋‹นํ•˜๋Š” ๋ฐฐ์—ด๊ฐ’๊ณผ ๋‹ค๋ฅด๋ฉด, ๊ทธ ๋‹ค์Œ idx์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฐ์—ด๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
            else:
                idx += 1
                new_arr[idx] = rotate_board[i][j]

        for j in range(n):
            rotate_board[i][j] = new_arr[j]

    return rotate_board

def select_dir(board, cnt):
    # 5๋ฒˆ ์ด๋™์‹œ์ผœ์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๋ธ”๋ก์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜
    global ans
    if cnt == 5:
        for i in range(n):
            for j in range(n):
                ans = max(ans, board[i][j])
        return

    for i in range(4):
        tmp_board = tilt(deepcopy(board), i)
        select_dir(tmp_board, cnt + 1)

n = int(sys.stdin.readline())
board = []
for _ in range(n):
    board.append(list(map(int, sys.stdin.readline().split())))

ans = 0
select_dir(board, 0)
print(ans)

์ฐธ๊ณ  ์ž๋ฃŒ

[์‹ค์ „ ์•Œ๊ณ ๋ฆฌ์ฆ˜] 0x0D๊ฐ• - ์‹œ๋ฎฌ๋ ˆ์ด์…˜

[Python] BOJ / 12100๋ฒˆ / 2048 (Easy)