[BOJ][๐ŸŸก4][๋ฐฑ์ค€#14722] ์šฐ์œ  ๋„์‹œ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #14722


๋ฌธ์ œ

์˜ํ•™์ด๋Š” ๋”ธ๊ธฐ์šฐ์œ , ์ดˆ์ฝ”์šฐ์œ , ๋ฐ”๋‚˜๋‚˜์šฐ์œ ๋ฅผ ์ข‹์•„ํ•œ๋‹ค. ์ž…๋ง›์ด ๋งค์šฐ ๊นŒ๋‹ค๋กœ์šด ์˜ํ•™์ด๋Š” ์ž์‹ ๋งŒ์˜ ์šฐ์œ ๋ฅผ ๋งˆ์‹œ๋Š” ๊ทœ์น™์ด ์žˆ๋‹ค.ย 

๋งจ ์ฒ˜์Œ์—๋Š” ๋”ธ๊ธฐ์šฐ์œ ๋ฅผ ํ•œ ํŒฉ ๋งˆ์‹ ๋‹ค. ๋”ธ๊ธฐ์šฐ์œ ๋ฅผ ํ•œ ํŒฉ ๋งˆ์‹  ํ›„์—๋Š” ์ดˆ์ฝ”์šฐ์œ ๋ฅผ ํ•œ ํŒฉ ๋งˆ์‹ ๋‹ค. ์ดˆ์ฝ”์šฐ์œ ๋ฅผ ํ•œ ํŒฉ ๋งˆ์‹  ํ›„์—๋Š” ๋ฐ”๋‚˜๋‚˜์šฐ์œ ๋ฅผ ํ•œ ํŒฉ ๋งˆ์‹ ๋‹ค. ๋ฐ”๋‚˜๋‚˜์šฐ์œ ๋ฅผ ํ•œ ํŒฉ ๋งˆ์‹  ํ›„์—๋Š” ๋”ธ๊ธฐ์šฐ์œ ๋ฅผ ํ•œ ํŒฉ ๋งˆ์‹ ๋‹ค.ย 

์ €๋ฒˆ ์ถ•์ œ์—์„œ ์ˆ˜๋งŽ์€ ์šฐ์œ ๋ฅผ ๋งˆ์…จ์ง€๋งŒ ๋”์šฑ ์šฐ์œ ์— ๊ฐˆ์ฆ์„ ๋Š๋‚€ ์˜ํ•™์ด๋Š” ์šฐ์œ  ์—ฌํ–‰์„ ๋– ๋‚ฌ๋‹ค. ๋ง›์žˆ๋Š” ์šฐ์œ ๋ฅผ ์ฐพ์•„ ๋– ๋‚œ ์˜ํ•™์ด๋Š” ์ˆ˜๋งŽ์€ ์šฐ์œ  ๊ฐ€๊ฒŒ๋กœ ๋‘˜๋Ÿฌ ์Œ“์ธ ์–ด๋Š ๋„์‹œ์— ๋„์ฐฉํ–ˆ๋‹ค. ์ด ๋„์‹œ๋Š” ์ •์‚ฌ๊ฐํ˜• ํ˜•ํƒœ์˜ 2์ฐจ์› ๊ฒฉ์ž ๋ชจ์–‘์œผ๋กœ ๋‚จ๋ถ์œผ๋กœ N๊ฐœ, ๋™์„œ๋กœ N๊ฐœ, ์ด N*N๊ฐœ์˜ ์šฐ์œ  ๊ฐ€๊ฒŒ๋“ค์ด ์žˆ๋‹ค. ์˜ํ•™์ด๋Š” ๋„์‹œ์˜ ์„œ๋ถ์ชฝ ๋ (1, 1)์—์„œ ์ถœ๋ฐœํ•ด์„œ ๋™๋‚จ์ชฝ ์•„๋ž˜ (N, N)๊นŒ์ง€ ๊นŒ์ง€ ๊ฐ€๋ฉด์„œ ์šฐ์œ ๋ฅผ ์‚ฌ ๋งˆ์‹ ๋‹ค.ย  ๊ฐ๊ฐ์˜ ์šฐ์œ  ๊ฐ€๊ฒŒ๋Š” ๋”ธ๊ธฐ, ์ดˆ์ฝ”, ๋ฐ”๋‚˜๋‚˜ ์ค‘ ํ•œ ์ข…๋ฅ˜์˜ ์šฐ์œ ๋งŒ์„ ์ทจ๊ธ‰ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ์šฐ์œ  ๊ฐ€๊ฒŒ ์•ž์—์„œ, ์˜ํ•™์ด๋Š” ์šฐ์œ ๋ฅผ ์‚ฌ ๋งˆ์‹œ๊ฑฐ๋‚˜, ์‚ฌ ๋งˆ์‹œ์ง€ ์•Š๋Š”๋‹ค. So cooooool~ํ•œ ์˜ํ•™์ด๋Š” ์˜ค์ง ๋™์ชฝ ๋˜๋Š” ๋‚จ์ชฝ์œผ๋กœ๋งŒ ์›€์ง์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ์ง€๋‚˜์นœ ์šฐ์œ  ๊ฐ€๊ฒŒ์—๋Š” ๋‹ค์‹œ ๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ์˜ํ•™์ด๊ฐ€ ๋งˆ์‹ค ์ˆ˜ ์žˆ๋Š” ์šฐ์œ ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ๋ผ.


์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์šฐ์œ  ๋„์‹œ์˜ ์˜์—ญ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N โ‰ค 1000) ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N+1 ๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์šฐ์œ  ๋„์‹œ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋”ธ๊ธฐ์šฐ์œ ๋งŒ์„ ํŒŒ๋Š” ๊ฐ€๊ฒŒ, 1์€ ์ดˆ์ฝ”์šฐ์œ ๋งŒ์„ ํŒŒ๋Š” ๊ฐ€๊ฒŒ, 2๋Š” ๋ฐ”๋‚˜๋‚˜์šฐ์œ ๋งŒ์„ ํŒŒ๋Š” ๊ฐ€๊ฒŒ๋ฅผ ๋œปํ•˜๋ฉฐ, 0, 1, 2 ์™ธ์˜ ์ •์ˆ˜๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.


์ถœ๋ ฅ

์˜ํ•™์ด๊ฐ€ ๋งˆ์‹ค ์ˆ˜ ์žˆ๋Š” ์šฐ์œ ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค.


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

4
0 1 2 2
1 1 1 1
2 2 2 2
0 0 1 0


์ถœ๋ ฅ

5


์˜ˆ์ œ 2

์ž…๋ ฅ

5
0 1 0 0 0
1 2 1 1 1
2 0 1 2 0
0 0 0 0 1
1 1 1 1 2


์ถœ๋ ฅ

9


My Sol

import sys
input = sys.stdin.readline

N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
dp = [[[0, -1] for _ in range(N+1)] for _ in range(N+1)]

for i in range(1, N+1):
    for j in range(1, N+1):
        left, up = dp[i][j-1], dp[i-1][j]
        left_check = (left[1]+1)%3 == mat[i-1][j-1]
        up_check = (up[1]+1)%3 == mat[i-1][j-1]

        left_score = left[0] + left_check
        up_score = up[0] + up_check
        if left_score > up_score:
            dp[i][j][0] = left_score
            dp[i][j][1] = mat[i-1][j-1] if left_check else left[1]

        else:
            dp[i][j][0] = up_score
            dp[i][j][1] = mat[i-1][j-1] if up_check else up[1]

print(dp[N][N][0])

DP๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์กฐ๊ธˆ ํŠน์ดํ–ˆ๋˜ ์ ์€, ๊ธฐ์ค€์ด ๋˜๋Š” ์œ„์˜ ์นธ๊ณผ ์™ผ์ชฝ ์นธ์˜ ์šฐ์œ  ์ •๋ณด ์ค‘ ์ฑ„ํƒ๋œ ๊ฒƒ์„ ์ €์žฅํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 3์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ–ˆ๋‹ค.


์ ‘๊ทผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. dp ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•ด ๋งŒ๋“ค์–ด์ค€๋‹ค.
  2. dp ์œ„์ชฝ๊ณผ ์™ผ์ชฝ์˜ ์นธ๋“ค์—์„œ ๊ฐ๊ฐ ์šฐ์œ  ์ •๋ณด(๊ฐ ์นธ[1])๋ฅผ ํ™•์ธํ•ด ์ง€๊ธˆ ์œ„์น˜ํ•˜๋Š” ์นธ๊ณผ ์—ฐ๊ฒฐ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  3. ์—ฐ๊ฒฐ์ด ๋œ๋‹ค๋ฉด ๋ˆ„์  ์šฐ์œ (๊ฐ ์นธ[0])์— 1์„ ๋”ํ•ด์ค€๋‹ค.
  4. ์ด๋ ‡๊ฒŒ ๋ˆ„์  ์—ฌ๋ถ€๊นŒ์ง€ ํ™•์ธํ•œ ์™ผ์ชฝ ์นธ๊ณผ ์œ„์˜ ์นธ์˜ ๋ˆ„์  ์šฐ์œ ๋ฅผ ๋น„๊ตํ•ด ๋” ํฐ ์ชฝ์„ ์ฑ„ํƒํ•œ๋‹ค.
  5. ์ด๋•Œ ์ฑ„ํƒ๋œ ์นธ์— ์ด๋ฏธ ์กด์žฌํ•˜๋˜ ์šฐ์œ  ์ •๋ณด์™€ ํ˜„์žฌ ์นธ์˜ ์šฐ์œ  ์ •๋ณด๊ฐ€ ์—ฐ๊ฒฐ๋œ๋‹ค๋ฉด ํ˜„์žฌ ์นธ์˜ ์šฐ์œ  ์ •๋ณด๋ฅผ, ์•„๋‹ˆ๋ผ๋ฉด ์ฑ„ํƒ๋œ ์นธ์˜ ์šฐ์œ ์ •๋ณด๋ฅผ ํ˜„์žฌ ์นธ์˜ ์šฐ์œ ์ •๋ณด์— ์ €์žฅํ•œ๋‹ค.

dp ๋ฐฐ์—ด์€ (N+1) x (N+1)์˜ ํฌ๊ธฐ๋กœ ์ •์˜ํ•˜๋ฉฐ, dp(1,1)์—์„œ ์œ„์ชฝ, ์™ผ์ชฝ ๊ฐ’์„ ์กฐํšŒํ•˜๋ฉฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— range(1, N+1)๋กœ ์ˆœํšŒํ•œ๋‹ค.

๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด ์‹ค์ˆ˜ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•ด๊ฐ€๋ฉฐ ์ถ”๊ฐ€ํ•ด ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!


๋ชจ๋ฒ”๋‹ต์•ˆ

์ถœ์ฒ˜

n=int(input())
m=[list(map(int,input().split())) for _ in range(n)]
d=[[0]*(n+1) for _ in range(n+1)]
for i in range(1,n+1):
    for j in range(1,n+1):
        d[i][j]=max(d[i-1][j],d[i][j-1])
        if d[i][j]%3==m[i-1][j-1]:d[i][j]+=1
print(d[-1][-1])

๋‚ด ํ’€์ด์— ๋น„ํ•ด ์—ฐ์‚ฐ์‹œ๊ฐ„์€ 55%, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์€ 40%, ์ฝ”๋“œ ๊ธธ์ด๋Š” 30% ์ •๋„ ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์„œ ๋ถ„์„ํ•ด๋ณด๋ ค ํ•œ๋‹ค.

์ด ๋ถ„์€ ์šฐ์œ  ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  2์ฐจ์› dp ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ, ์šฐ์œ  ์ •๋ณด๋Š” ํ˜„์žฌ๊นŒ์ง€์˜ ๋ˆ„์  ์šฐ์œ ๋ฅผ 3์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ด์šฉํ–ˆ๋‹คโ€ฆ ๋‚œ ์™œ ์ด ์ƒ๊ฐ์„ ๋ชป ํ–ˆ์ง€..

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

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ