본문 바로가기
알고리즘

[DP] N으로 표현

by limew 2023. 9. 3.

https://school.programmers.co.kr/learn/courses/30/lessons/42895?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

로직

수를 만들어내는 방법

사칙연산 (+, -, *, /)와 숫자를 붙여서 만드는 방법

 

  • i+1길이의 배열을 만들어 i번째에 N을 i개 사용하여 만들 수 있는 모든 수를 추가한다.
    • 문자열.repeat(n번) 
  • 먼저 i 번쨰 set에 숫자N을 i번 붙여만든 수를 추가한다 (5, 55, 555, 5555....) = i는 N을 사용한 갯수이다
  • 2개의 N으로 만들 수 있는 수는 55, 5+5, 5-5, 5*5, 5/5다
  • 3개의 N으로 만들 수 있는 수는
    • 555
    • 1개의 N으로 만든 수와 2개의 N으로 만든 수의 사칙연산과
    • 2개의 N으로 만든 수와 1개의 N으로 만든 수의 사칙연산이다 (5 - 55 !== 55-5 이라 사칙연산의 순서도 고려해야한다.)
  • 4개의 N으로 만들 수 있는 수는 
    • 5555,
    • 1개의 N으로 만든 수와 3개의 N으로 만든 수의 사칙연산,
    • 2개의 N으로 만든 수와 2개의 N으로 만든 수의 사칙연산,
    • 3개의 N으로 만든 수와 1개의 N으로 만든 수의 사칙연산이다

 

이런식으로 i = 8일때까지 각 i에 대해 가능한 연산들을 저장해서 i개의 N으로 만들 수 있는 수를 기억한다.

그 중에 타켓 숫자가 나오면 i를 리턴한다

i가 8보다 크면 -1를 리턴한다.

 

 

set 은 for of 가능하다

const sets = Array.from({length: 9}, () => new Set());

[
    Set(1) { '' },
    Set(1) { '5' },
    Set(1) { '55' },
    Set(1) { '555' },
    Set(1) { '5555' },
    Set(1) { '55555' },
    Set(1) { '555555' },
    Set(1) { '5555555' },
    Set(1) { '55555555' }
]

for (const s of set) {
	console.log(s) // sets[0], sets[1], sets[2]....
}

 

 

전체코드

function solution(N, number) {
    const sets = Array.from({length: 9}, () => new Set());
    // 5, 55, 555 ...추가
    sets.forEach((set, i) => {
        set.add(Number(String(N).repeat(i)));
    })
    
    for (let i = 1; i <= 8; i++) {
        for (let j = 1; j <= i; j++) { //
            for (const first of sets[j]) {
                for (const second of sets[i-j]) {
                    sets[i].add(first+second);
                    sets[i].add(first-second);
                    sets[i].add(first*second);
                    sets[i].add(Math.floor(first/second));
                }
                if (sets[i].has(number)) return i;
            }
        }
    }
    return -1;
}

'알고리즘' 카테고리의 다른 글

색종이 만들기 (dfs)  (0) 2023.09.23
[그리디] 체육복  (0) 2023.09.20
[DP] 등굣길  (0) 2023.09.01
[DP] 스티커 모으기(2), 도둑질  (0) 2023.09.01
[DP] 땅따먹기  (0) 2023.08.31