๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Š Algorithm/BOJ

โœ… BOJ 30805 - LCS(Longest Common Subsequence)

by huis_log 2025. 7. 15.

์‚ฌ์ „ ์ˆœ ์ตœ๋Œ€ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด (๋ฐฑ์ค€ 30805)

๋‘ ์ˆ˜์—ด A, B์—์„œ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ๊ฐ€์žฅ ํฐ ๊ฑธ ์ฐพ๋Š” ๋ฌธ์ œ.

 

ํ•ต์‹ฌ์€ ๊ทธ๋ฆฌ๋””. ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ํ˜„์žฌ A์™€ B์˜ ๋‚จ์€ ๊ตฌ๊ฐ„์—์„œ ๊ณตํ†ต์œผ๋กœ ๋“ฑ์žฅํ•˜๋Š” ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ํฐ ์ˆ˜ ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฆ„.

์ˆซ์ž ๋ฒ”์œ„๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์—(1~100) ์ด๊ฒŒ ๊ฐ€๋Šฅํ•จ. ์ฐพ์€ ์ˆ˜๋Š” ์ •๋‹ต ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ณ , ๋‹ค์Œ ํƒ์ƒ‰์€ ๊ทธ ์ˆซ์ž ์ดํ›„๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘.

 

list.index(val, start)๋กœ ํƒ์ƒ‰ ์‹œ์ž‘ ์ง€์ ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ถ€๋ถ„ ์ˆ˜์—ด ์กฐ๊ฑด ์ง€ํ‚ด. ์Šฌ๋ผ์ด์‹ฑ์€ ์•ˆ ์“ฐ๊ณ  ์ธ๋ฑ์Šค๋งŒ ๋„˜๊ฒจ์„œ ์„ฑ๋Šฅ ์œ ์ง€.

๋” ์ด์ƒ ๊ณตํ†ต๋˜๋Š” ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฉด ์ข…๋ฃŒ. ์ตœ์ข…์ ์œผ๋กœ ์ •๋‹ต ์ˆ˜์—ด ๊ธธ์ด์™€ ๊ฐ’๋“ค์„ ์ถœ๋ ฅํ•˜๋ฉด ๋จ.


#์ตœ์žฅ๊ธธ์ด ๊ณตํ†ต์ˆ˜์—ด Longest Common Subsequence
import sys
input=sys.stdin.readline

def find_max_value(a,b,a_start_idx,b_start_idx):
    max_val=-1
    for a_num in a[a_start_idx:]:
        for b_num in b[b_start_idx:]:
            if a_num==b_num:
                if a_num>max_val:
                    max_val=a_num
                break
    return max_val if max_val!=-1 else False

def find_max_common_subsequence(a,b):
    a_start_idx=0
    b_start_idx=0
    answer=[]
    while True:
        max_common_value=find_max_value(a,b,a_start_idx,b_start_idx)
        if not max_common_value:
            break
        answer.append(max_common_value)
        a_start_idx=a.index(max_common_value,a_start_idx)+1
        b_start_idx=b.index(max_common_value,b_start_idx)+1
    
    return answer

def main():
    n=int(input().strip())
    a=list(map(int,input().split()))
    m=int(input().strip())
    b=list(map(int,input().split()))
    
    answer=find_max_common_subsequence(a,b)
    print(len(answer))
    print(' '.join(map(str,answer)))
    
if __name__=="__main__":
    main()

 

max_value ์ฐพ๊ณ  ๊ทธ ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ๋ฆฌ์ŠคํŠธ์˜ ๋’ค ์›์†Œ๋งŒ ๋ณด๊ฒŒ ํ•˜๋ฉด์„œ, ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋Š”๋ฐ LCS ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ธ ์ค„ ์•Œ๊ณ  ํ—ท๊ฐˆ๋ ค์„œ ์ข€ ๋งŽ์ด ํ—ค๋ฉค. ์•„์ด๋””์–ด ์•ˆ ๋– ์˜ค๋ฅด๋ฉด ๊ฝค๋‚˜ ์ŠคํŠธ๋ ˆ์Šค ๋ฐ›๋Š” ๋ฌธ์ œ.

๋ฐ˜์‘ํ˜•