Light Blue Pointer
본문 바로가기
Coding Test

[백준] 수들의 합

by Greedy 2024. 3. 30.

문제 주소

https://www.acmicpc.net/problem/1789

 

1789번: 수들의 합

첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.

www.acmicpc.net

문제 설명

서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까?

입력

첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.

출력

첫째 줄에 자연수 N의 최댓값을 출력한다.

예제 입력 1

200

예제 출력 1

19

 

제출 코드

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        long n = Long.parseLong(st.nextToken());
        long count = 0;
        long sum = 0;
        long last = 0;
        long diff = 0;

        for(long l = 1; l<=n;l++){
            sum = sum+l;
            if(sum>n){
                last = l-1;
                diff = sum-n;
                break;
            }
            count++;
        }
        if(diff<=last){
            System.out.println(count);
        }

    }
}

코드 설명

제일 많이 더하려면 1부터 작은것들로 채워나가야 하는데

더한 값이 n을 넘었을때

diff(n과 넘친 sum의 차이)가 분명 마지막에 더한 원소보다 작을 것이므로 

diff인 원소를 하나 빼주고 마지막 원소를 넣어서 sum을 n에 딱 맞추면 됨

 

풀이 과정

1부터 다른거 하나씩 더해줌

그리고 넘치면 넘친 숫자의 값을 가진 원소를 하나 배제하고 세면 될 거 같다고 생각함

4,294,967,295는 32비트 부호 없는 정수의 최대값입니다. 즉, 이 값은 32비트 unsigned integer로 표현할 때의 최대값입니다.-> 이게 Integer의 MAX_VALUE = 0x7fffffff 보다 크길래 long에다 넣어줌

 

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        long n = Integer.parseInt(st.nextToken());
        long count = 0;
        long sum = 0;
        long last = 0;
        long diff = 0;

        for(long l = 1; l<=n;l++){
            sum = sum+l;
            if(sum>n){
                last = l-1;
                diff = sum-n;
                break;
            }
            count++;
        }
        if(diff<=last){
            System.out.println(count);
        }

    }
}

200 넣으면 19가 잘 나오길래 제출했더니

런타임 에러가 뜸

 

알고보니 parseLong 해줘야 하는데 너무 parseInt가 습관이 돼서 그거 당연하다고 생각하고 안 바꿔줬음

long n = Integer.parseInt(st.nextToken());

long n = Long.parseLong(st.nextToken());

 

이거 바꿔주고 맞았다

'Coding Test' 카테고리의 다른 글

[백준] 블랙잭  (0) 2024.04.01
[백준] 한수  (0) 2024.03.30
[프로그래머스] 테이블 해시 함수  (0) 2024.03.27
[프로그래머스] 시소 짝꿍  (0) 2024.03.26
[프로그래머스] 프로세스  (1) 2024.03.25