티어 : Sliver 5
정답여부 : 오답
알고리즘 유형 : 수학, 그리디 알고리즘
시간 제한 : 2초
💡문제
● 수들의 합
💡입력
200
💡출력
19
💡문제 분석
서로 다른 N 개의 자연수의 합이 S가 될 때 가장 큰 N 자연수를 구하면 되는 문제
-> 자연수 합 S 보다 작을 수도 있고 딱 맞을 수도 있음
💡알고리즘 설계
- 자연수 합을 입력 받음
- 자연수는 1부터 시작하는데 자연수의 합을 더하는 sum의 값이 S보다 큰 경우 for 문을 나감
- max_number에 i값을 넣어서 출력
💡시간복잡도
- O(N)
💡틀린 코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int S = Integer.parseInt(br.readLine());
int sum = 0; // 자연수 들의 합
int max_number = 0; // 가장 큰 자연수 -> 우리가 찾아야 할 값
for(int i = 1; i < S; i++) { // 자연수는 1부터 시작
sum+= i;
if(sum > S) { // S를 넘으면 종료
break;
}
max_number = i;
}
System.out.println(max_number);
💡 틀린 이유
문제에서 주어진 S가 첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다. -> int의 최대값인 2,147,483,647을 넘기 때문이다. 즉 Int값을 초과하여 long 타입을 써줘야 함
💡정답 코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long S = Long.parseLong(br.readLine());
long sum = 0; // 자연수 들의 합
int max_number = 0; // 가장 큰 자연수 -> 우리가 찾아야 할 값
for(int i = 1; i< Integer.MAX_VALUE ; i++) { // 자연수는 1부터 시작
sum+= i;
if(sum > S) { // S를 넘으면 종료
break;
}
max_number = i;
}
System.out.println(max_number);
}
}
💡 느낀점 or 기억할정보
주어진 범위값 잘 보자!
'CodingTest > Baekjoon' 카테고리의 다른 글
[B0J]단어 뒤집기(9093번) (0) | 2024.11.13 |
---|---|
[B0J]스택(10828번) (0) | 2024.11.12 |
[B0J]가르침(1062번) (0) | 2024.10.14 |
[B0J]빗물(14719번) (0) | 2024.10.08 |
[B0J]괄호의 값(2504번) (0) | 2024.10.07 |