알고리즘/프로그래머스

LEVEL 3 : N으로 표현

webmaster 2021. 11. 23. 16:07
728x90

https://programmers.co.kr/learn/courses/30/lessons/42895

 

코딩테스트 연습 - N으로 표현

 

programmers.co.kr

 

  • 문제
    • 문제
    • N을 사용해서 number을 표현할 수 있는 최소한의 개수를 출력하는 문제

풀이

  • DFS 를 활용한 문제이다.
  • 어떻게 해결해야 될지 몰라 정답 코드를 찾아보았다(아직ㅜㅜ 부족하다)
  • 재귀 함수를 활용하여 390,624번을 경우의 수를 코드로 구현
    • 종료 조건 1 : count 값이 8 초과 일 경우 : N이 8번 이상 나온 경우로 이때는 계산할 필요 없으므로 return
    • 종료 조건 2 : 만약 계산한 값이(SUM) 표현해야 할 번호 number와 같다면 그때의 최솟값을 저장하고 retrun
    • x값을 N으로 선언 후 , for문을 통해 1 ~ 8-count를 제외한 만큼 돈다( 8번 이상 나올 수 없으므로)
      • x = N  : dfs(N,number,count+1,sum + x), dfs(N, number, count+1, sum - x), dfs(N, number, count+1, sum * x), dfs(N, number, count+1, sum / x)
      • x = NN : dfs(N,number,count+1,sum + x), dfs(N, number, count+1, sum - x), dfs(N, number, count+1, sum * x), dfs(N, number, count+1, sum / x)
      • ...... 8-count까지 반복
      • N, NN, NN.... 8-count번의 N까지 sum 값에 사칙연산을 실행하여 준다
  • public static int answer;
    public static int solution(int N, int number) {
    	answer = Integer.MAX_VALUE;
    	dfs(N,number,0,0);
    	return answer == Integer.MAX_VALUE ? -1 : answer;//dfs로 만족하는 값을 못찾으면 -1, 최솟값 있다면 최솟값 리턴
    }
    private static void dfs(int n, int number, int count, int sum) {
    	if(count > 8)//종료 조건 1
    		return;
    	if(number == sum) {// 종료조건 2
    		answer = Math.min(answer, count);//최솟값 저장
            return;
        }
        int x = n;
      	for(int i=1;i<=8;++i) {//최대 count 값은 8개까지이므로 1~8-count 까지 
          dfs(n, number, i+count, sum+x);//사칙연산
          dfs(n, number, i+count, sum-x);
          dfs(n, number, i+count, sum*x);
          dfs(n, number, i+count, sum/x);
          x = (10*x) + n;// N, NN, NNN , .... , 8-count 개의 N
    	}
    }​
  •  
728x90

'알고리즘 > 프로그래머스' 카테고리의 다른 글

LEVEL 3 : 디스크컨트롤러  (0) 2021.11.25
LEVEL 3 : [1차] 추석 트래픽  (0) 2021.11.24
LEVEL 3 : 등굣길  (0) 2021.11.23
LEVEL 3 : 가장 먼 노드  (0) 2021.11.22
LEVEL 3 : 입국심사  (0) 2021.11.22