미소를뿌리는감자의 코딩

[백준 2024/01/22] 2231번 분해합 본문

코딩 테스트/백준

[백준 2024/01/22] 2231번 분해합

미뿌감 2024. 1. 22. 17:56
728x90

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

 

1. 접근 방법

100*x + 10*y + z + x + y + z = ? 일때, xyz를 찾아라, 이런 문제였다.

따라서 나는 

101*x + 11*y + 2z 가 ? 인 xyz를 찾으면 되겠다고 생각하였다.

따라서, 1부터 값을 하나씩 증가시켜가며 xyz에 대입해나갔고, 그중에 해당하는 값이 나타날 시,

그 값을 출력하고 break 하였다. 만약 해당하는 값을 찾지 못했을 시에는 0을 출력해 주었다.

 

이렇게 풀어서 제출하면 정답이 맞긴 하다. 하지만 너무 비효율적인 방법이라고 생각이 들었고,

다른 분들이 제출한 결과물들의 경우 속도 그리고 메모리 적인 측면에서 나보다 빨랐기에

코드를 들여다 보니, 나의 반대 방법으로 접근해서 풀었었다.

 

즉, xyz를 예측한 후 +x +y +z 를 하고 비교를 하는 방법이었다.

 

내 풀이가 조금 비효율적이라는 생각이 들었다..ㅠ 

+ 풀이하기까지 많은 시간 소요

조금 아쉬운 문제이다.

 

2. 코드

import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.util.Comparator;
import java.util.Collections;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.*;

public class b2231 {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        int k = Integer.parseInt(reader.readLine());
        int k2;

        List<List<Integer>> total_list = new ArrayList<>();
        List<Integer> list = Arrays.asList(100001, 10001, 1001, 101, 11, 2);
        List<Integer> sub_list = new ArrayList<>();

        for (int i = 0; i <6; i++) {
            if(k/ list.get(i) != 0){
                while(i!=6){
                    sub_list.add(list.get(i));
                    i++;
                }
            }
        }


        int max = sub_list.size();
        int min;
        if(max-3>=0){
            min = max-3;
        }
        else{
            min = 0;
        }

        int printed = 0;
        for(int i = (int)Math.pow(10,min); i< (int)Math.pow(10,max); i++){
            String num_str = String.valueOf(i);
            if(num_str.length()!= max){
                int add_zero = max-num_str.length();
                for(int j = 0; j<add_zero; j++){
                    num_str = String.format("0%s", num_str);
                }
            }

            int result = 0;
            for(int p = 0; p<max; p++){
                result += sub_list.get(p)*Character.getNumericValue(num_str.charAt(p));
                //System.out.println(result);
            }


            if(result == k){
                System.out.println(num_str);
                printed = 1;
                break;
            }

        }

        if(printed!=1){
            System.out.println(0);
        }
    }
}

 

 

728x90