21.08.13 기록

1 분 소요

백준 알고리즘 2231 풀이

🎆나의 풀이(메모리 18.3MB, 시간 168ms로 통과)

-N의 최댓값(1,000,000)을 포함하는 크기의 배열을 선언한 후, 인덱스의 분해합을 저장했다.
-이후 입력값 N까지 인덱스를 순회하며, 생성자를 출력했다.


  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;

  public class B2231 {
      public static int[] numbers = new int[1_000_000+1];

      public static void main(String[] args) throws IOException {
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          int N = Integer.parseInt(br.readLine());

          //1부터 1,000,000까지 분해합 저장
          setConstructor();

          int res = -1;
          for(int i = 1; i < N; i++) {
              if(numbers[i] == N ) {  //가장 먼저 일치한 인덱스가 최솟값
                  res = i;
                  break;
              }
          }
          if(res < 0) { System.out.println(0); }  //res값이 초기값인 경우 0 출력
          else { System.out.println(res); }
      }

      public static void setConstructor() {
          //1의 자리
          for(int i = 1; i < 10; i++) {
              numbers[i] = (2*i);
          }

          //10의 자리
          for(int i = 10; i < 100; i++) {
              numbers[i] = (i + (i/10) + (i%10));
          }

          //100의 자리
          for(int i = 101; i < 1000; i++) {
              numbers[i] = (i + (i/100) + (i/10%10) + (i%10));
          }

          //1,000의 자리
          for(int i = 1001; i < 10000; i++) {
              numbers[i] = (i + (i/1000) + (i/100%10) + (i%100/10) + (i%10));
          }

          //10,000의 자리
          for(int i = 10001; i < 100_000; i++) {
              numbers[i] = (i + (i/10000) + (i/1000%10) + (i/100%10) + (i%100/10) + (i%10));
          }

          //100,000의 자리
          for(int i = 100001; i < 1_000_000; i++) {
              numbers[i] = (i + (i/100_000) + (i/10000%10) + (i/1000%10) + (i/100%10) + (i%100/10) + (i%10));
          }

          //1,000,000일 때
          numbers[1_000_000] = (1_000_000 + 1);
      }


🎆해설(메모리 14.2MB, 시간 136ms로 통과)

-네자릿수 N은 임의의 정수 K와 K의 각 자리수의 합과 같다.

$N_{(3)}$ = K + $k_{(1)}$ + $k_{(2)}$ + $k_{(3)}$ + $k_{(4)}$

-네자릿수 N의 각 자릿수 합의 최대는 9 + 9 + 9 + 9 이다.
-즉, 출력값(K)을 구하는 범위는 N - (9 * K의 길이) 가 된다.

K = $N_{(3)}$ - ($k_{(1)}$ + $k_{(2)}$ + $k_{(3)}$ + $k_{(4)}$)

-위 식을 활용한 코드는 아래와 같다.

  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;

  public class B2231 {
      public static void main(String[] args) throws IOException {
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          String strN = br.readLine();
          int N = Integer.parseInt(strN);

          int res = 0;
          for(int i = (N - (strN.length() * 9)); i < N; i++) {
              int num = i;
              int sum = 0;

              while(num != 0) {
                  sum += (num % 10);
                  num /= 10;
              }

              if(sum + i == N) {
                  res = i;
                  break;
              }
          }
          System.out.println(res);
      }
  }

카테고리:

업데이트: