๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 9465_์Šคํ‹ฐ์ปค

๋ฟŒ์•ผ._. 2022. 3. 15. 21:57

Silver I

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/9465)

<์Šคํ‹ฐ์ปค>

๋ฌธ์ œ 

 

์ƒ๊ทผ์ด์˜ ์—ฌ๋™์ƒ ์ƒ๋ƒฅ์ด๋Š” ๋ฌธ๋ฐฉ๊ตฌ์—์„œ ์Šคํ‹ฐ์ปค 2n๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ๋‹ค. ์Šคํ‹ฐ์ปค๋Š” ๊ทธ๋ฆผ (a)์™€ ๊ฐ™์ด 2ํ–‰ n์—ด๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋‹ค. ์ƒ๋ƒฅ์ด๋Š” ์Šคํ‹ฐ์ปค๋ฅผ ์ด์šฉํ•ด ์ฑ…์ƒ์„ ๊พธ๋ฏธ๋ ค๊ณ  ํ•œ๋‹ค.
์ƒ๋ƒฅ์ด๊ฐ€ ๊ตฌ๋งคํ•œ ์Šคํ‹ฐ์ปค์˜ ํ’ˆ์งˆ์€ ๋งค์šฐ ์ข‹์ง€ ์•Š๋‹ค. ์Šคํ‹ฐ์ปค ํ•œ ์žฅ์„ ๋–ผ๋ฉด, ๊ทธ ์Šคํ‹ฐ์ปค์™€ ๋ณ€์„ ๊ณต์œ ํ•˜๋Š” ์Šคํ‹ฐ์ปค๋Š” ๋ชจ๋‘ ์ฐข์–ด์ ธ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ๋—€ ์Šคํ‹ฐ์ปค์˜ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์œ„, ์•„๋ž˜์— ์žˆ๋Š” ์Šคํ‹ฐ์ปค๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

๋ชจ๋“  ์Šคํ‹ฐ์ปค๋ฅผ ๋ถ™์ผ ์ˆ˜ ์—†๊ฒŒ๋œ ์ƒ๋ƒฅ์ด๋Š” ๊ฐ ์Šคํ‹ฐ์ปค์— ์ ์ˆ˜๋ฅผ ๋งค๊ธฐ๊ณ , ์ ์ˆ˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๊ฒŒ ์Šคํ‹ฐ์ปค๋ฅผ ๋–ผ์–ด๋‚ด๋ ค๊ณ  ํ•œ๋‹ค. ๋จผ์ €, ๊ทธ๋ฆผ (b)์™€ ๊ฐ™์ด ๊ฐ ์Šคํ‹ฐ์ปค์— ์ ์ˆ˜๋ฅผ ๋งค๊ฒผ๋‹ค. ์ƒ๋ƒฅ์ด๊ฐ€ ๋—„ ์ˆ˜ ์žˆ๋Š” ์Šคํ‹ฐ์ปค์˜ ์ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ฆ‰, 2n๊ฐœ์˜ ์Šคํ‹ฐ์ปค ์ค‘์—์„œ ์ ์ˆ˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋ฉด์„œ ์„œ๋กœ ๋ณ€์„ ๊ณต์œ  ํ•˜์ง€ ์•Š๋Š” ์Šคํ‹ฐ์ปค ์ง‘ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.
์œ„์˜ ๊ทธ๋ฆผ์˜ ๊ฒฝ์šฐ์— ์ ์ˆ˜๊ฐ€ 50, 50, 100, 60์ธ ์Šคํ‹ฐ์ปค๋ฅผ ๊ณ ๋ฅด๋ฉด, ์ ์ˆ˜๋Š” 260์ด ๋˜๊ณ  ์ด ๊ฒƒ์ด ์ตœ๋Œ€ ์ ์ˆ˜์ด๋‹ค. ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง€๋Š” ๋‘ ์Šคํ‹ฐ์ปค (100๊ณผ 70)์€ ๋ณ€์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋™์‹œ์— ๋—„ ์ˆ˜ ์—†๋‹ค.

 

์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” n (1 ≤ n ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ๋‘ ์ค„์—๋Š” n๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ ์ •์ˆ˜๋Š” ๊ทธ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” ์Šคํ‹ฐ์ปค์˜ ์ ์ˆ˜์ด๋‹ค. ์—ฐ์†ํ•˜๋Š” ๋‘ ์ •์ˆ˜ ์‚ฌ์ด์—๋Š” ๋นˆ ์นธ์ด ํ•˜๋‚˜ ์žˆ๋‹ค. ์ ์ˆ˜๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๋‹ค. 

 

 

์ถœ๋ ฅ 

 

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋งˆ๋‹ค, 2n๊ฐœ์˜ ์Šคํ‹ฐ์ปค ์ค‘์—์„œ ๋‘ ๋ณ€์„ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ์Šคํ‹ฐ์ปค ์ ์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

- ์ดˆ๊ธฐ ์ฝ”๋“œ: ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค

import sys

if __name__ =='__main__':
    T=int(input())

    side=[0,1]

    for i in range(T):
        arr = []
        n=int(input())
        arr.append(list(map(int, sys.stdin.readline().split())))
        arr.append(list(map(int, sys.stdin.readline().split())))

        answer=0
        result_a=[arr[0][0]]
        check=1
        for j in range(1,n-1):
            temp=result_a[-1]+arr[side[check]][j]
            if temp+arr[side[check-1]][j+1]>result_a[-1]+arr[side[check]][j+1]:
                result_a.append(temp)
                if check==0:
                    check=1
                else:
                    check=0
            else:
                if j==n-2:
                    result_a.append(result_a[-1]+arr[side[check]][n-1])

        answer=result_a[-1]

        result_a=[arr[1][0]]
        check=0
        for j in range(1,n-1):
            temp=result_a[-1]+arr[side[check]][j]
            if temp+arr[side[check-1]][j+1]>result_a[-1]+arr[side[check]][j+1]:
                result_a.append(temp)
                if check==0:
                    check=1
                else:
                    check=0
            else:
                if j==n-2:
                    result_a.append(result_a[-1]+arr[side[check]][n-1])

        if answer>=result_a[-1]:
            print(answer)
        else:
            print(result_a[-1])

 

๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜๊ณ  ๋‚ด๊ฐ€ ์ œ์ถœํ–ˆ์ง€๋งŒ ์ง€๊ธˆ ์ƒ๊ฐํ•ด๋„ ์—‰๋ง์ธ ์ฝ”๋“œ๋‹ค

์ฒ˜์Œ ์ƒ๊ฐํ•œ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

(a)

์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋Œ€๊ฐ์„ ์˜ ์Šคํ‹ฐ์ปค๋ฅผ ๋”ํ–ˆ์„ ๋•Œ์™€ ๋Œ€๊ฐ์„ ์„ ๋›ฐ์–ด๋„˜๊ณ  ๋Œ€๊ฐ์„  ์˜†์˜ ์Šคํ‹ฐ์ปค ์ ์ˆ˜๋ฅผ ๋”ํ–ˆ์„๋•Œ์˜ ์ ์ˆ˜๋ฅผ ๋น„๊ตํ•˜์—ฌ

๋ฆฌ์ŠคํŠธ์— ๋„ฃ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

์•ž์— ๋‚˜์˜ฌ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํž˜๋“  ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. ๋งž๋Š” ๊ฒƒ ๊ฐ™์œผ๋ฉด์„œ๋„ ํ‹€๋ ธ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

- my solution

import sys

if __name__ =='__main__':
    T=int(input()) # ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

    for i in range(T):
        arr = [] # ์Šคํ‹ฐ์ปค ์ ์ˆ˜
        n=int(input())
        arr.append(list(map(int, sys.stdin.readline().split())))
        arr.append(list(map(int, sys.stdin.readline().split())))

        dp=[[arr[0][0]],[arr[1][0]]]
        for j in range(1,n):
            if j==1:
                dp[0].append(dp[1][0]+arr[0][j])
                dp[1].append(dp[0][0]+arr[1][j])
            else:
                dp[0].append(max(arr[0][j]+dp[1][j-1], arr[0][j]+dp[1][j-2]))
                dp[1].append(max(arr[1][j]+dp[0][j-1], arr[1][j]+dp[0][j-2]))
        if dp[0][-1]>=dp[1][-1]: # ์ตœ๋Œ“๊ฐ’ ์ถœ๋ ฅ
            print(dp[0][-1])
        else:
            print(dp[1][-1])

 

๋‹ค์‹œ ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

(b)

๊ทธ๋ฆผ (a)์™€ ๋น„์Šทํ•ด ๋ณด์ด์ง€๋งŒ ํ™”์‚ดํ‘œ์˜ ๋ฐฉํ–ฅ์„ ๋ณด๋ฉด ๋‹ค๋ฅธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์€ ์•ž์—์„œ ๋’ค๋ฅผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ทธ๋ฆผ (b)๋Š” ๋’ค์—์„œ ์•ž์„ ๊ณ ๋ คํ•˜์˜€๋‹ค. ์Šคํ‹ฐ์ปค์™€ ๋ณ€์„ ๊ณต์œ ํ•˜๋Š” ์Šคํ‹ฐ์ปค๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ฐ์„  ์˜†์˜ ์Šคํ‹ฐ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋Œ€๊ฐ์„  ์Šคํ‹ฐ์ปค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž…๋ ฅ
  • n, ์Šคํ‹ฐ์ปค ์ ์ˆ˜ ์ž…๋ ฅ
  • dp : ์Šคํ‹ฐ์ปค ์ ์ˆ˜์˜ ํ•ฉ ์ €์žฅ

  • dp ๊ตฌํ•œ ๊ฐ’ ์ค‘ ์ตœ๋Œ“๊ฐ’ ์ถœ๋ ฅ

 


์ƒ๊ฐ๐Ÿค”

 

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.

์ฒ˜์Œ ์ฐพ์€ ๊ทœ์น™์ด ์กฐ๊ธˆ ์ด์ƒํ•˜๋‹ค ํ–ˆ๋”๋‹ˆ ๊ฒฐ๊ตญ... ํ‹€๋ ธ์ง€์š” ~_~

์กฐ๊ธˆ๋งŒ ๋” ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ–ˆ์œผ๋ฉด... ๋” ๋ถ„๋ฐœํ•˜์ž ๐Ÿ˜ฑ