[백준/BOJ] 1789번 : 수들의 합 (JAVA / 자바)
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/1789
1789번: 수들의 합
첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.
www.acmicpc.net
- 문제 -
난이도 실버 5 문제이다.
자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
(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);
}
}
-결과-
아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.