[BOJ] 12100. 2048 (Easy) (๐Ÿฅ‡, ๋ฐฑํŠธ๋ž˜ํ‚น, ์‹œ๋ฎฌ๋ ˆ์ด์…˜)

lemythe423ยท2023๋…„ 10์›” 2์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
62/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

๋ฌธ์ œ์—์„œ ์•Œ๋ ค์ค€ 2048 ๊ฒŒ์ž„ ๋ฃฐ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ด๋™ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ™์€ ์ˆซ์ž๊ฐ€ ์—ฐ์†์œผ๋กœ 2๊ฐœ ์žˆ๋‹ค๋ฉด ํ•ฉ์ณ์ง„๋‹ค.
(๋‹จ, ๋นˆ์นธ์€ ๊ณ ๋ คํ–์ง€ ์•Š๋Š”๋‹ค.)

  • ๊ทธ๋ฆผ์—์„  ์™ผ์ชฝ์œผ๋กœ ์ด๋™

ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด๋™ํ•˜๋Š” ๋ฐฉํ–ฅ ์ชฝ์— ์œ„์น˜ํ•œ 2๊ฐœ๋ฅผ ๋จผ์ € ํ•ฉ์นœ๋‹ค.

  • ๊ทธ๋ฆผ์—์„  ์œ„์ชฝ์œผ๋กœ ์ด๋™

์ด๋ฏธ ํ•œ ๋ฒˆ์˜ ์ด๋™์œผ๋กœ ๋‹ค๋ฅธ ์ˆซ์ž์™€ ํ•ฉ์ณ์ง„ ์ˆซ์ž๋Š” ๋˜ ๋‹ค๋ฅธ ์ˆซ์ž์™€๋Š” ํ•ฉ์ณ์งˆ ์ˆ˜ ์—†๋‹ค.

  • 2+2๋Š” 4๊ฐ€ ๋˜์ง€๋งŒ 4+4๊ฐ€ 8์ด๋  ์ˆ˜๋Š” ์—†๋‹ค. ์ด๋ฏธ ์œ„๋กœ ์ด๋™ํ•˜๋ฉด์„œ 2,2๊ฐ€ ๊ฐ๊ฐ ํ•ฉ์ณ์ ธ์„œ 4๊ฐ€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ.

๋ณด๋“œํŒ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋Š” 20x20์ด๋ฉฐ ์ด 5๋ฒˆ ์ง„ํ–‰๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ์— ์ƒํ•˜์ขŒ์šฐ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฏ€๋กœ 4^5 = ๋Œ€๋žต 4์ฒœ๋ฒˆ ์ดํ•˜๋กœ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ์ง„ํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

์˜ค๋ฅธ์ชฝ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ฐพ๊ธฐ(์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ)

์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฐ ๊ฐ’์„ ํƒ์ƒ‰ํ•˜๊ธฐ ๊ฐ€์žฅ ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์ค€์œผ๋กœ ์ •ํ–ˆ๋‹ค. ๊ฐ€์žฅ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ์ˆซ์ž๋ฅผ i๋กœ ์„ค์ •ํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ๊ฐ’์„ j๋กœ ์„ค์ •ํ•˜์—ฌ j๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ 1) ๊ฐ™์€ ๊ฐ’์ด ์žˆ๋Š”์ง€ 2) ๋‹ค๋ฅธ ๊ฐ’์ด ์žˆ๋Š”์ง€๋ฅผ ํƒ์ƒ‰ํ–ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ™๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ฐ’์ด ์—†๊ณ  ์ „๋ถ€๋‹ค ๋นˆ์นธ์ด๋ผ๋ฉด ํƒ์ƒ‰์„ ์ข…๋ฃŒํ–ˆ๋‹ค.

ํƒ์ƒ‰์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ๊ฐ’ i๊ฐ€ ๋นˆ ์นธ์ด๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

๋นˆ ์นธ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์Œ ๊ฐ’๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๊ฐ’์„ ํƒ์ƒ‰ํ•œ๋‹ค. ๋งŒ์•ฝ j์— ์œ„์น˜ํ•œ ๊ฐ’์ด ๋นˆ ์นธ์ด๋ฉด ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋„˜์–ด๊ฐ„๋‹ค. ๋นˆ ์นธ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋‘ ๊ฐœ์˜ ๊ฒฝ์šฐ๋กœ ๋‚˜๋‰˜๊ฒŒ ๋œ๋‹ค. ๊ฐ™์€ ์ˆซ์ž์ธ ๊ฒฝ์šฐ๋Š” ๋”ํ•˜๊ณ , ๋‹ค๋ฅธ ์ˆซ์ž์ธ ๊ฒฝ์šฐ๋Š” ๊ทธ ์ˆซ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

๋ธ”๋ก ์ด๋™

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

๋ฐฐ์—ด ๋Œ๋ฆฌ๊ธฐ

์™ผ์ชฝ -> ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํƒ์ƒ‰ํ•ด๋‚˜๊ฐ€๋Š” ์ฝ”๋“œ๊ฐ€ ๊ธฐ์ค€์ด๋‹ค. ์ฆ‰ ๋ชจ๋“  ๋ธ”๋ก์ด ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ธฐ์ค€์ด ๋œ๋‹ค. ์œ„, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋“ค์€ 2์ฐจ์› ๋ฐฐ์—ด์„ ํšŒ์ „์‹œ์ผœ์„œ ๊ณ„์‚ฐํ•œ ํ›„ ๋‹ค์‹œ ํšŒ์ „์‹œํ‚จ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค.

์ตœ์ข… ์ฝ”๋“œ

# 2048 (Easy)

def rotate(dir, board):
    if dir == 1: # UP
        arr = move(list(map(list, zip(*board))))
        return list(map(list, zip(*arr)))
    elif dir == 2: # DOWN
        arr = move(list(map(list, zip(*board[::-1]))))
        return list(map(list, zip(*arr)))[::-1]
    elif dir == 3: # RIGHT
        arr = move(row[::-1] for row in board)
        return [row[::-1] for row in arr]
    else: # LEFT
        return move(board)
    
def move(board):
    arr = []
    for row in board:
        i = -1
        tmp = []
        while i<N-1:
            i += 1
            if not row[i]:
                continue
            j = i
            while j<N-1:
                j += 1
                # ๋นˆ ์นธ์ธ ๊ฒฝ์šฐ
                if not row[j]:
                    continue
                # ๊ฐ™์€ ๊ฐ’์ธ ๊ฒฝ์šฐ
                if row[j] == row[i]:
                    tmp.append(2*row[i])
                    i = j
                    break
                # ๋‹ค๋ฅธ ๊ฐ’์ธ ๊ฒฝ์šฐ
                if row[j] != row[i]:
                    tmp.append(row[i])
                    i = j-1
                    break
            # ์•„๋ฌด๋Ÿฐ ๊ฐ’๋„ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ ๊ทธ๋ƒฅ ๊ทธ ๊ฐ’์„ ์ถ”๊ฐ€
            else:
                tmp.append(row[i])
                break
        arr.append(tmp+[0]*(N-len(tmp)))
    return arr

def game(round, board):
    global answer
    if round == 5:
        for row in board:
            answer = max(answer, max(row))
        return 

    for d in range(4):
        tmp = rotate(d, [row[:] for row in board])
        game(round+1, tmp)

N = int(input())
board = [list(map(int, input().split())) for _ in range(N)]

answer = 0
game(0, board)
print(answer)
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€