백준

[백준/BOJ] 1789번 : 수들의 합 (JAVA / 자바)

코메인 2022. 3. 25. 23:31

안녕하세요~ 코딩하는 코알못 코메인입니다.

 

 

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

 

1789번: 수들의 합

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

www.acmicpc.net


- 문제 -

 

난이도 실버 5 문제이다.

 

자바에서 입력방식은 scanner와 bufferedreader가 있다.

자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.

bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.

더 자세한 내용은 아래 글 참고 하면 좋다.

https://comain.tistory.com/3

 

(JAVA / 자바) Scanner 와 Bufferedreader

안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자

comain.tistory.com

 

풀이 방법

N에 들어올 수 있는 최대한의 값을 구하라 한다.

그렇다면 어려울거없이 1부터 차례대로 빼나가면 된다. 빼다가 남은 값이 빼야할 값보다 작으면 멈추고, 빼야할 값에 -1을 해주면 그 값이 N이다.

예제 1로 예를 들어보자.

200을 만들기위한 서로 다른 자연수들의 합에서 자연수들의 개수가 최대가 되기 위해선 위에서 말한 것처럼 1부터 빼주자.

200 - 1 = 199 / 199 - 2 = 197 / 197 - 3 = 194 / 194 - 4 = 190 / 190 - 5 = 185 / 185 - 6 = 179 / 179 - 7 = 172

172 - 8 = 164 / 164 - 9 = 155 / 155 - 10 = 145 / 145 - 11 = 134 / 134 - 12 = 122 / 122 - 13 = 109

109 - 14 = 95 슬슬 적어지는 폭이 커지니 아래로 나열해보겠다.

95 - 15 = 80

80 - 16 = 64

64 - 17 = 47

47 - 18 = 29

29 - 19 = 10

10 - 20 일때가 남은 값이 빼줘야 할 값이 더 클때이다.

이렇다면 돌아가서 29 남았을때 빼줘야 할 자연수는 29가 된다.

그렇게 되면 총 사용 된 자연수는 1~18까지하고, 29이다. 총 개수는 19개가 된다.

필자는 처음에 구해진 마지막 빼줘야할 값 20에 -1을 해주기로했다. 그렇게하면 19가 되는 것이다.

 

코드를 보자.


-풀이-

 

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

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());
		
		//빼줄 값
		int N = 1;
		while(true) {
			if(S >= N) S -= N;
			//S보다 N이 작다면 반복을 종료해준다.
			else break;
			N++;
		}
		//--N을 해주는 이유는 N와 --는 순서상에 문제가 생기기에 N--를 하면 N을 출력하고 --를 한다.
		//그렇기에 빼주고 출력하기 위해 --를 앞에 두자.
		System.out.println(--N);
	}

}

-결과-

 


아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.