본문 바로가기
공부/알고리즘

[프로그래머스] N으로 표현

by yeaseul912 2022. 7. 5.
728x90

1.  문제 설명

더보기

아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다.

12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5

5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다.
이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요.

2. 제한사항

더보기
  • N은 1 이상 9 이하입니다.
  • number는 1 이상 32,000 이하입니다.
  • 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
  • 최솟값이 8보다 크면 -1을 return 합니다.

3. 입출력예

N number return
5 12 4
2 11 3

4. 풀이

Solution 1 : 동적 계획법

1. 숫자 N의 갯수별로 만들수 있는 list를 8개 만든다. (최솟값이 8보다 크면 -1 리턴)

2. 숫자 N에 대하여, 갯수 별로 만들 수 있는 수를 넣어준다. ( 3자리 부터는 앞에서 사용했던 조합을 사용한다. 이것이 동적계획법!)

( N=5, 1자리 : 5, 2자리 : 5+5, 5-5, 5*5, 5/5, 3자리 : 1자리조합 + 2자리조합, 1자리 - 2자리, 1자리 * 2자리, 1자리 / 2자리 ...) 

3. 중복 된 값이 들어가지 않도록 list에 set 형태로 값을 넣어준다.

4. 각 list마다 연속된 숫자를 잊지 말고 넣어준다. (2자리 : 55)

5. 갯수 별로 계산한 값이 target number와 같은 값이면 return 갯수 를 해준다.

import java.util.*;
class Solution {
    public int solution(int N, int number) {
        List<Set<Integer>> list = new ArrayList<>();
        for(int i=0; i<9; i++){
          list.add(new HashSet<>());
        }
        list.get(1).add(N);
        if(number == N) return 1;
        for(int i=2; i<9; i++){
          for(int j=1; j<=i/2; j++){
            numberParse(list.get(i), list.get(i-j), list.get(j));
            numberParse(list.get(i), list.get(j), list.get(i-j));
          }
            String str = String.valueOf(N);
            list.get(i).add(Integer.parseInt(str.repeat(i)));
          for(Integer n : list.get(i)){
            if(n == number){
              return i;
            }
          }
        }
    return -1;
  }
  public void numberParse(Set<Integer> unionSet, Set<Integer> fibo1, Set<Integer> fibo2){
    for(Integer f1 : fibo1){
      for(Integer f2 : fibo2){
        unionSet.add(f1+f2);
        unionSet.add(f1-f2);
        unionSet.add(f1*f2);
        if(f2!=0) unionSet.add(f1/f2);
      }
    }
  }
}

 

5. 풀이 설명

ppt로 설명 (그림 글)

6. 결과 

Solution 1

 

반응형

댓글