Recent Posts
소소한 개발이야기
[백준 #1789번 JAVA] 수들의 합 풀이 본문
📄 수들의 합 [백준 1789번]
문제 해설
문제는 for문을 이용하여 해결하였습니다. 문제를 처음 봤을 때 어려워 보일 수 있지만 조금만 쉽게 생각하면 해결하기 쉽습니다. 먼저 문제의 조건을 살펴보겠습니다.
문제 조건
서로 다른 N개의 자연수의 합이 S라고 할 때 자연수 N의 최댓값을 구하여라.
즉, 가장 많은 자연수를 사용해서 S를 만들어라 라고 이야기 하는 것과 같습니다. 문제의 예제를 보면 S가 200이라고 주어져 있는데 200을 만들 수 있는 가지수는 아래와 같습니다.
1 + 199
1 + 2 + 197
1 + 2 + 3 + 194
...
문제의 풀이는 가장 많은 수를 사용해야 하기 때문에 1부터 더해가면서 주어진 S를 넘지 않는 선까지 모두 더했을 때 마지막 더한 값이 됩니다.
여기서 주의해야 할 점은 1부터 모든 수를 더했을 때 주어진 S보다 커질 때 입니다. 만약 모든 수를 더했을 때 주어진 S보다 크다면 N까지 더한 수에서 S를 만들기 위해 어떤 자연수 하나를 빼면 됩니다.
예제 1
주어진 S = 50
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
즉, 만들어진 수는 55이기 때문에 50을 만들기 위해선 모두 더한 수에서 5만 빼주면 50을 만들 수 있다.
글보단 코드를 보면 더 이해하기 쉽습니다.
🌱 main 함수
public static void main(String[] args) throws IOException {
long n = Long.parseLong(br.readLine());
System.out.println(solve(n));
}
🌱 solve 함수
주어진 n을 만들 수 있는 최대 자연수 N을 구하는 함수입니다.
static int solve(long n) {
long sum = 0;
int addNum = 0;
while(n >= sum) {
sum += (++addNum);
}
return sum == n ? addNum : addNum - 1;
}
💡 Github에 더 많은 문제 풀이가 있습니다.
'BOJ' 카테고리의 다른 글
[백준 #1080번 JAVA] 행렬 풀이 (0) | 2019.06.20 |
---|---|
[백준 #1205번 JAVA] 등수 구하기 풀이 (0) | 2019.06.19 |
[백준 #1946번 JAVA] 신입 사원 풀이 (0) | 2019.06.18 |
[백준 #10610번 JAVA] 30 풀이 (0) | 2019.06.18 |
[백준 #1931번 JAVA] 회의실 배정 풀이 (0) | 2019.06.10 |
Comments