[BOJ][๐ŸŸก4][๋ฐฑ์ค€#10942] ํŒฐ๋ฆฐ๋“œ๋กฌ?

์ž‘์„ฑ:    

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

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

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #10942


๋ฌธ์ œ

๋ช…์šฐ๋Š” ํ™์ค€์ด์™€ ํ•จ๊ป˜ ํŒฐ๋ฆฐ๋“œ๋กฌ ๋†€์ด๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๋จผ์ €, ํ™์ค€์ด๋Š” ์ž์—ฐ์ˆ˜ N๊ฐœ๋ฅผ ์น ํŒ์— ์ ๋Š”๋‹ค. ๊ทธ ๋‹ค์Œ, ๋ช…์šฐ์—๊ฒŒ ์งˆ๋ฌธ์„ ์ด M๋ฒˆ ํ•œ๋‹ค. ๊ฐ ์งˆ๋ฌธ์€ ๋‘ ์ •์ˆ˜ S์™€ E(1 โ‰ค S โ‰ค E โ‰ค N)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, S๋ฒˆ์งธ ์ˆ˜๋ถ€ํ„ฐ E๋ฒˆ์งธ ๊นŒ์ง€ ์ˆ˜๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ด๋ฃจ๋Š”์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋ฉฐ, ๋ช…์šฐ๋Š” ๊ฐ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค ๋˜๋Š” ์•„๋‹ˆ๋‹ค๋ฅผ ๋งํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ™์ค€์ด๊ฐ€ ์น ํŒ์— ์ ์€ ์ˆ˜๊ฐ€ 1, 2, 1, 3, 1, 2, 1๋ผ๊ณ  ํ•˜์ž.

S = 1, E = 3์ธ ๊ฒฝ์šฐ 1, 2, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค. S = 2, E = 5์ธ ๊ฒฝ์šฐ 2, 1, 3, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์•„๋‹ˆ๋‹ค. S = 3, E = 3์ธ ๊ฒฝ์šฐ 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค. S = 5, E = 7์ธ ๊ฒฝ์šฐ 1, 2, 1์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.

์ž์—ฐ์ˆ˜ N๊ฐœ์™€ ์งˆ๋ฌธ M๊ฐœ๊ฐ€ ๋ชจ๋‘ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ช…์šฐ์˜ ๋Œ€๋‹ต์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด์˜ ํฌ๊ธฐ N (1 โ‰ค N โ‰ค 2,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ํ™์ค€์ด๊ฐ€ ์น ํŒ์— ์ ์€ ์ˆ˜ N๊ฐœ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์น ํŒ์— ์ ์€ ์ˆ˜๋Š” 100,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์…‹์งธ ์ค„์—๋Š” ํ™์ค€์ด๊ฐ€ ํ•œ ์งˆ๋ฌธ์˜ ๊ฐœ์ˆ˜ M (1 โ‰ค M โ‰ค 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋„ท์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ํ™์ค€์ด๊ฐ€ ๋ช…์šฐ์—๊ฒŒ ํ•œ ์งˆ๋ฌธ S์™€ E๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

์ด M๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ํ™์ค€์ด์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋ช…์šฐ์˜ ๋‹ต์„ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ์ถœ๋ ฅํ•œ๋‹ค. ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ ๊ฒฝ์šฐ์—๋Š” 1, ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” 0์„ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์ž…๋ ฅ

7
1 2 1 3 1 2 1
4
1 3
2 5
3 3
5 7


์ถœ๋ ฅ

1
0
1
1


My Sol

import sys
input = sys.stdin.readline
sys.setrecursionlimit(500000)

def expand_pal(s, e):
    global nums, N, mat
    if s < 0 or e >= N: return
    if nums[s] != nums[e]: return
    mat[s][e] = 1
    expand_pal(s-1, e+1)

N = int(input())
nums = list(input().split())
mat = [[0]*N for _ in range(N)]

for i in range(N):
    mat[i][i] = 1
    expand_pal(i-1, i+1)

for i in range(N-1):
    if nums[i] != nums[i+1]: continue
    mat[i][i+1] = 1
    expand_pal(i-1, i+2)

T = int(input())
for _ in range(T):
    s, e = map(lambda x: int(x)-1, input().split())
    print(mat[s][e])

DP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์‚ฌ์‹คโ€ฆ DP๋ฅผ ์‚ฌ์šฉํ•œ๊ฑด๊ฐ€ ์‹ถ๊ธฐ๋„ ํ•˜๋‹ค. ์ค„์ด๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ• ์ง€, ๋ป—์ณ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ• ์ง€ ์„ ํƒํ•ด์•ผ ํ–ˆ๊ณ , ๋‚˜๋Š” ๋ป—์ณ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.


ํ’€์ด์˜ ํ•ต์‹ฌ์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ์‹œ์ž‘๊ณผ ํ™•์žฅ์ด๋‹ค.

  • ํ•œ ๊ฐœ์˜ ์š”์†Œ๋Š” ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.
  • 2๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์„œ๋กœ ๊ฐ™๋‹ค๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.
  • ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ์–‘ ๋์˜ ์š”์†Œ๊ฐ€ ์„œ๋กœ ๊ฐ™๋‹ค๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค.


  1. ์‹œ์ž‘ ์ธ๋ฑ์Šค s๋ฅผ ํ–‰, ๋ ์ธ๋ฑ์Šค e๋ฅผ ์—ด๋กœ ํ•˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  2. ์œ„์˜ ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ์‹œ์ž‘ ์กฐ๊ฑด 2๊ฐ€์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™•์žฅ ์žฌ๊ท€๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ mat์„ ์ฑ„์šด๋‹ค.
  3. mat[s][e]๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


๊ฒฐ๊ณผ

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

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