새소식

알고리즘 풀이/백준

백준 2231 - 분해합

  • -

1. 문제 접근

    1) 우선 생성자를 하나 딱 두고 계산을 시작해야한다. 주어진 수에서는 규칙을 찾을 수 없다.

    2) 어쨌든 주어진 수 = 생성자 + 생성자 각 자리수이니까 가장 큰 생성자부터 거꾸로 가야 빨리 찾을 수 있을 것 같다.

    3) 가장 작은 수를 찾아야하므로 마지막까지 비교하면서 구해준다.

    4) 마지막? : 후보가 될 수 있는 최소의 수! 각 자리수에 나올 수 있는 수는 최대 9이다. 그러니까 주어진 수에서, (주어진 수의 길이) * 9만큼을 빼준 값이 후보가 될 수 있는 최소의 수다!

 

 

2. 변수

변수 유형 변수 이름 설명
멤버변수(main) N 주어진 수
nCount 주어진 수의 길이
멤버변수(main - for) sum 생성자와 그 자릿 수의 합을 저장
num 큰 자릿수 부터 계산하기 위한 변수

 

3. 코드

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

public class Bronze2_2231_부분합 {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
		int nCount = Integer.toString(N).length();
		
		
		int answer = Integer.MAX_VALUE;
		for(int i = N; i > N - (nCount*9); i--) {
			int sum = i;
			int num = i;
			
			for(int j = 1_000_000; j >= 10; j /=10) {
				sum += num / j;
				num %= j;
			}
			sum += num;
			
			if(sum == N) {
				answer = Math.min(answer, i);
			}
			
		}
		if(answer == Integer.MAX_VALUE) {
			sb.append(0);
		}else {
			sb.append(answer);
		}
		
		System.out.println(sb);
	}

}

 

핳 대박 6022명에서 51등 했다..!!!!!!!!!! 짜릿

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.