https://www.acmicpc.net/problem/1789
1789번: 수들의 합
첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.
www.acmicpc.net
문제
코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long S = sc.nextLong();
long n=0;
long k=0;
long i=1;
while(true) {
if(k+i>S) {
break;
}
k+=i;
i++;
n++;
}
System.out.print(n);
}
}
해결방법
서로 다른 N개의 자연수의 합이 S이다. 한 번 생각해보면
S=10
1 + 2 + 3 + 4 => N=4
S=17
1 + 2 + 3 + 4 + 5 + 6 => X
1 + 2 + 3 + 4 + 7 => N=5
이런 식으로 써볼 수가 있는데 S=10인 경우엔 1부터 차례대로 더하면 10이 된다. 하지만 S=17인 경우에는 차례대로 더하면 17이 나오지 않는다. 이 말의 즉슨 S값을 넘어가는 마지막 자연수를 더하기 전에 원하는 값을 만들어줘야 한다는 의미이다. 차례대로 더했기에 뭘 더하든 원하는 값은 나올 수 없기 때문이다.
고로 S=17인 경우엔 5번째 더하는 자리에서 끝을 맺어야한다.
코드로 생각해보면 S값을 넘어가는 마지막 자연수를 더하기 전의 자연수의 개수가 곧 합이 S인 서로 다른 자연수의 개수인 셈이다. 이를 토대로 코드를 작성하여 해결하였다.
틀린 이유
처음 제줄하였을 때, 런타임 에러(InputMismatch)로 틀렸는데 그 이유는 자연수 S의 범위는 1 ≤ S ≤ 4,294,967,295인데 변수를 int형으로 선언하였기 때문이다. 코드를 보면 변수 S 이외에 k도 반드시 long형으로 선언해야 한다. 혹시 몰라 변수 n과 k도 long형으로 선언하였다. 이런 실수는 정말 하지 않아야 한다.
'알고리즘 > 백준' 카테고리의 다른 글
1439번 : 뒤집기 (0) | 2022.06.26 |
---|---|
10610번 : 30 (1) | 2022.06.22 |
10162번 : 전자레인지 (0) | 2022.06.22 |
5585번 : 거스름돈 (0) | 2022.06.22 |
백준 2751번 : 수 정렬하기2 (0) | 2021.08.18 |