μ½”ν…Œ/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[Programmers μ½”λ”©ν…ŒμŠ€νŠΈ] λ™μ κ³„νš - N으둜 ν‘œν˜„

πŸ“Œ μ•Œκ³ λ¦¬μ¦˜ 정리

2021.04.28 - [μ•Œκ³ λ¦¬μ¦˜] - 동적 κ³„νšλ²•(Dynamic Programming)


πŸ“ƒ λ¬Έμ œ

κ΄„ν˜Έ, 이어뢙이기(55, 555 같은), 사칙연산 λͺ¨λ‘ κ°€λŠ₯이기 λ•Œλ¬Έμ—

경우의 μˆ˜κ°€ λ‹€μ–‘ν–ˆκ³  λ©μ²­ν•œ μ €λŠ” 일단 ν•˜λ‚˜μ”© μ¨λ³΄λ©΄μ„œ 문제의 κ·œμΉ™μ„ μ°Ύμ•„λ³΄κΈ°λ‘œ ν•˜μ˜€μŠ΅λ‹ˆλ‹€...


✍ ν’€μ΄κ³Όμ •

λ™μ κ³„νšλ²• κ°œλ… μ •λ¦¬ν•˜κ³  λ‚˜μ„œ 이 문제λ₯Ό 봀을 λ•Œ,

N μ‚¬μš© νšŸμˆ˜μ— λ”°λΌμ„œ μ €μž₯ν•˜κ³  νšŸμˆ˜κ°€ λ§Žμ•„μ§ˆ λ•Œ κ·Έ μ „μ˜ μ €μž₯ν•΄λ‘” 값듀을 μ‚¬μš©ν•΄μ•Ό κ² λ‹€λŠ” 생각이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

 

κ΄„ν˜Έλ₯Ό μ–΄λ–»κ²Œ 해야할지 감이 μ•ˆ μž‘ν˜”λŠ”λ° λ‹€ μ¨λ³΄κ³ λ‚˜μ„œ μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€...(λ„ˆλœλ„ˆλœ)

 

N μ‚¬μš© νšŸμˆ˜κ°€ 3인 경우,

- 3개 이어뢙이기

- (2) + 1

- 1 + (2)

둜 λ‚˜λˆ„μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λ•Œ, 2 +1μ—μ„œ '+'둜 λ‚˜λˆ„μ–΄μ§„ 경우 "(2) + (1)"처럼 κ΄„ν˜Έκ°€ λΆ™λŠ”λ‹€κ³  μƒκ°ν•˜κ³  문제λ₯Ό ν’€μ—ˆμŠ΅λ‹ˆλ‹€.(κ΄„ν˜Έμ— 따라 κ²°κ³Όκ°€ 달라지기 λ•Œλ¬Έμ—)

 

1 + 1 + 1도 μžˆλŠ”λ° μ™œ λΉΌλŠ”μ§€λΌλŠ” 생각이 λ“œμ‹€ μˆ˜λ„ μžˆλŠ”λ°

(N) β—‡ (N) β—‡ (N) 은 λ“€μ–΄κ°ˆ μ—°μ‚°μžμ— λ”°λΌμ„œ κ²°κ΅­ κ΄„ν˜Έκ°€ 묢이게 λ˜λŠ”λ°

(◇은 쀑간에 λ“€μ–΄κ°ˆ μ—°μ‚°μžλ₯Ό λœ»ν•©λ‹ˆλ‹€!)

 

예λ₯Ό λ“€μ–΄μ„œ (5) + (5) / (5)라 치면

5 + (5/5)둜 λ‹€μ‹œ 묢이게 λ˜μ–΄μ„œ "1 + 2"ν˜•νƒœκ°€ λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

쀑볡이 μΌμ–΄λ‚˜κΈ° λ•Œλ¬Έμ— μ΄λŠ” ꡳ이 λ”°λ‘œ 생각할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

 

N μ‚¬μš© νšŸμˆ˜κ°€ 4인 κ²½μš°μ—,

- 2 + 1 +1 / 1 + 2 +1 / 1 + 1 +2

- 1 + 1 + 1 +1

인 κ²½μš°λ„ μžˆλŠ”λ°

 

1 + 1 + 1 +1 인 κ²½μš°λŠ” μœ„μ—μ„œ μ„€λͺ…ν•œ 것과 같이

2 + 1 +1 / 1 + 2 +1 / 1 + 1 +2 ν˜•νƒœλ‘œ 묢일 수 있고(5*5 +5 + 5)

μ΄λŠ” 또 2+2, 3+1, 1+3 ν˜•νƒœλ‘œ 묢일 수 μžˆμœΌλ―€λ‘œ μ€‘λ³΅λ˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.

 

이런 μ‹μœΌλ‘œ 생각을 ν•˜κ³  μ½”λ“œλ₯Ό 짜기 μ‹œμž‘ν–ˆλŠ”λ°λ„ μ–΄λ ΅λ”λΌκ΅¬μš”~,~

 

Top-down, Bottom-up 쀑 μ–΄λŠ 방식을 선택해야할지 λ¨Όμ € μƒκ°ν•΄λ΄€λŠ”λ°

μž‘μ€ μˆ˜λΆ€ν„° μŒ“μ•„κ°€λŠ” 것이 λ§žλ‹€λŠ” 생각이 λ“€μ–΄μ„œ Bottom-up 방식을 μ‚¬μš©ν•΄μ•Όκ² λ‹€κ³  μƒκ°ν–ˆκ³ 

λ¬Έμ œμ—μ„œ μ΅œμ†Ÿκ°’μ΄ 8보닀 크면 -1을 returnν•œλ‹€κ³  ν•˜μ˜€μœΌλ―€λ‘œ

νšŸμˆ˜κ°€ 8일 λ•ŒκΉŒμ§€λ§Œ ꡬ해면 될 λ“― ν•©λ‹ˆλ‹€!

 

μ΄μ–΄λΆ™μ΄λŠ” κ²½μš°λŠ” μ•„μ˜ˆ λ¨Όμ € μ €μž₯해두고 μ‹œμž‘ν•©λ‹ˆλ‹€.

쀑볡을 ν”Όν•˜κΈ° μœ„ν•΄μ„œ set()에 μ €μž₯ν•΄μ€λ‹ˆλ‹€.

F=[set() for i in range(8)]

for n in range(8):
        F[n].add(int(str(N)*(n+1)))

 

μ²˜μŒμ—λŠ” set이 μ•„λ‹Œ list에 μ €μž₯ν–ˆλ‹€κ°€ μ•„μ£Ό λ‚œλ¦¬λ‚œλ¦¬μ˜€μŠ΅λ‹ˆλ‹€....

 

 

이제 이어뢙이지 μ•ŠλŠ” 경우λ₯Ό μƒκ°ν•΄λ΄…μ‹œλ‹€!

 

F[0], 즉 N μ‚¬μš© νšŸμˆ˜κ°€ 1일 λ•ŒλŠ” 이어뢙인 값밖에 μ—†κΈ° λ•Œλ¬Έμ— λ›°μ–΄λ„˜κ³  F[1]λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€.

μ‚¬μš© νšŸμˆ˜μ™€ index값이 "-1" 차이가 λ‚˜κΈ° λ•Œλ¬Έμ— forλ¬Έ 돌릴 λ•Œ μ•½κ°„ ν—·κ°ˆλ ΈλŠ”λ°

 

n을 F의 index, N의 μ‚¬μš© 횟수λ₯Ό cnt라고 ν•˜λ©΄

n = cnt -1

F[n] = F[i] + F[n-i-1] (0<=i < n)

라고 정리할 수 μžˆκ² μŠ΅λ‹ˆλ‹€.

 

점점 F[n] μ±„μ›Œκ°€λ©΄ F[n]의 ν¬κΈ°λŠ” μ—„μ²­λ‚˜κ²Œ λΆˆμ–΄λ‚©λ‹ˆλ‹€.

number와 같을 λ•Œλ₯Ό μ²΄ν¬ν•΄μ€˜μ•Ό ν•˜λŠ”λ° κ°€λœ©μ΄λ‚˜ 4쀑 for문인데

μ–΄λ””μ—μ„œ μ²΄ν¬ν•΄μ€˜μ•Ό νš¨μœ¨μ„±μ΄ μ’‹μ„κΉŒ μƒκ°ν•˜λ‹€κ°€

 

1 .4번째 forλ¬Έμ—μ„œ +, -, *, / ν• λ•Œ λ°”λ‘œ 체크할지

2. F[n]을 λͺ¨λ‘ μ €μž₯ν•œ 후에 체크할지

 

1λ²ˆμ€ μ½”λ“œκ°€ 쑰금 μ§€μ €λΆ„ν•΄μ§ˆ 것 κ°™μ•„μ„œ κ·Έλƒ₯ 2번으둜 μ„ -택

def solution(N, number):
    if N==number:
        return 1
    F=[set() for i in range(8)]
    for n in range(8):
        F[n].add(int(str(N)*(n+1)))

    for n in range(1,8):
        for i in range(n):
            for a in F[i]:
                for b in F[n-i-1]:
                    F[n].add(a+b)
                    F[n].add(a - b)
                    F[n].add(a * b)
                    if b!=0:
                        F[n].add(a // b)

        if number in F[n]:
            return (n+1)
    
    return -1

 

 

λ¬Έμ œλŠ” λ³΅μž‘ν•˜μ§€λ§Œ μ½”λ“œλŠ” κΉ”λ”ν•˜κ²Œ λ”± μ§œμ΄λŠ” 것 κ°™λ„€μš₯!


πŸ’― μ •ν™•μ„±/νš¨μœ¨μ„± ν…ŒμŠ€νŠΈ


πŸ† κ³ μˆ˜λ‹˜λ“€μ˜ μ½”λ“œ

λ‹€λ₯Έ λΆ„λ“€μ˜ 풀이λ₯Ό μ œλŒ€λ‘œ λœ―μ–΄λ³΄μ§€λŠ” λͺ»ν–ˆκ³  νœ˜λšœλ£¨λ΄€λŠ”λ° 저와 λΉ„μŠ·ν–ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€!

 

문제 ν‘ΈλŠ”λ° λ„ˆλ¬΄ νž˜λΉ μ Έμ„œ μ˜€λŠ˜μ€ λ›°μ–΄λ„˜κ² μˆ¨λ„€λ‹€......


πŸ”” μƒˆλ‘­κ²Œ μ•Œκ²Œ 된 λ‚΄μš©


πŸ€” κ°œμ„  λ°©μ•ˆ


πŸ’Œ 질문/ν”Όλ“œλ°±


πŸƒ‍♀️ 마치며...