문제
어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.
자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.
출력
첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.
예제 입력 1 복사
216
예제 출력 1 복사
198
= 오답 코드 =
처음에 내 코드에 오답을 찾지 못했는데, 질문으로 해결했다.
테스트 코드를 직접 내가 생각하고 작성하는 것도 실력인데 아직 그런 부분까지는 많이 부족한 것 같다.
구해진 분해합값이 내가 입력한 n값과 일치하는지에 대해 찾아야 되는 건데
분해합 값을 구하는 도중에 n값과 일치하는지 찾는 식으로 코드가 작성되어있기 때문에 틀렸다.
반례를 들어보면 20을 입력하면 0이 나와야한다.
근데 내가 짠 코드를 보면 20을 입력할 때, 19에서 1을 더하는 과정에서 20이 되기 때문에 20이 출력된다.
쉬운 문제여도 이런 사소한 실수로 인해서 오답일 수 있으니까 좀 더 꼼꼼하게 작성하고 더 깊게 생각해야겠다.
= 더 깔끔한 코드 ( 다른 사람이 작성한 코드 참고 ) =
메모리를 줄이고 시간을 줄일 수 있는 방법이다
내가 구하려는 분해합은 198이다.
자연수 n의 가장 작은 생성자를 구하는 문제이기 때문에 무조건 n보다 작은 수의 값이 나올 수 밖에 없고
for문으로 0~n까지 범위를 돌면서
1. while문을 이용: i값에 i값을 각 자리 합을 더한 것이 n이면 그 i값은 분해합, 즉 n의 생성자가 된다는 점을 이용했고
2. 최솟값을 만족시키기 위해 break를 사용
따라서 내가 맨 처음 생각해서 해결했던 내용보다 더 간결하고 쉽게 짤 수 있었다.
다른 사람의 풀이를 보는 것도 내 시야를 넓히고 여러가지 방식을 알 수 있게해줘서 정말 좋다!
'백준 오답노트 > 브루트포스' 카테고리의 다른 글
백준 - 브루트포스 1436번 영화감독 숌 / 문제를 이해 못 함. (0) | 2022.12.12 |
---|---|
백준 - 브루트포스 1018번 체스판 다시 칠하기 / 강의로 해결 (0) | 2022.12.10 |