문제는 다음과 같다.
- 방법은 두 가지가 존재하는데%연산자와 / 연산자를 잘 이용해서 모든 경우의 수를 검사하면 된다. 1부터 N까지 모든 경우의 수를 찾는 방법, 이 방법은 힌트만 남기고 넘어가겠다. %연산자와 / 연산자를 잘 이용해서 모든 경우의 수를 검사하면 된다.
- 알고리즘을 찾아서 이용하기.
필자는 2번을 이용해서 풀었다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(bf.readLine()); //처음 입력받기
int result = 0; //결과 담기
for(int i = (n - (Integer.toString(n).length() * 9)); i<n; i++) { //i의 초기값을 자리수 *9만큼 빼주기
int index = i;
int sum = 0;
while(index != 0) { //검사
sum += index % 10;
index /=10;
}
if(sum + i ==n) {
result = i;
break;
}
}
bw.write(result+""); //아스키값 방지
bw.flush();
}
}
왜 i의 초기값을 입력받은 n의 자리수만큼 *9 해서 빼주었을까?
조금만 생각해보고 정 모르겠다면 밑으로 내려가면 된다.
그리고 BufferedWriter을 사용하여 int형을 출력할 땐 간단히 String으로 바꾸어서 출력해야 아스키코드의 값이 나오지 않는다.
19로 예를 들어보겠다.
19는 10과 9의 합이다. 일의 자리를 k1, 십의 자리를 k2라고 하자.
그럼 각 k 합의 최대는 몇일까?
k2 + k1 = 18이다.
9 + 9 = 18
각 k의 최대 값은 9를 넘지 않는다.
그러므로 우리는 각 자리수만큼의 최대값 (9)를 모두 더한 값을 빼주면 그 미만의 값들은 생성자가 될 수 없다는 것을 알 수있다.
다시 19로 예를들면
k2 + k1 = 18
19-18 =1
1보다 작은 0은 생성자가 될 수 없다는 사실이다.
큰수도 마찬가지로 적용하니 한 번 생각해보면 좋을 것 같다.
'백준 문제풀이' 카테고리의 다른 글
[백준] 1152번 (0) | 2024.03.30 |
---|---|
[백준] 1037번 풀이 (0) | 2024.03.17 |
[백준] 1032번 문제풀이 (0) | 2024.02.20 |
[백준] 1920번 문제풀이 (0) | 2024.02.10 |
[백준]10828번 문제풀이 (0) | 2024.02.05 |