일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 재귀
- 프로젝트
- DB
- springboot
- Spring Security
- 그래프 탐색
- 그래프 이론
- 프로그래머스
- 스택
- 수학
- 배포
- dfs
- MYSQL
- JPA
- 문자열
- 백트래킹
- 정보처리기사
- 구현
- 깊이 우선 탐색
- 브루트포스 알고리즘
- 정수론
- 다이나믹 프로그래밍
- 알고리즘
- Vue
- 소수 판정
- n과 m
- 너비 우선 탐색
- 백준
- 자료 구조
- SWEA
Archives
- Today
- Total
영원히 남는 기록, 재밌게 쓰자
백준 [1024] 수열의 합 (JAVA) 본문
728x90
반응형
문제
풀이
합이 N이면서 연속된 수열의 길이가 적어도 L인 수열을 구해야 한다.
처음에 공식을 바로 사용하길래 이 공식이 무슨 공식인줄 잘 이해가 안되었다. 근데 연속된 수의 합이라서 공차가 1인 등차수열을 생각해서 해당 공식을 찾아보았다.
등차 수열의 합 공식
a가 첫 항, n이 항의 갯수 d가 공차(여기서는 1)
a를 구하는 방법은 합인 N이 주어졌을 때 그 몫(N/L)의 앞뒤 수를 (L-1)/2만큼 더하거나 뺐을 때 연속된 수가 나온다.
(N/L) - (L-1)/2를 하면 몫을 기준으로 연속된 수의 가장 처음 수를 구하는 식인데 이게 음수이면 안된다.
그리고 이 수가 등차수열 합 공식의 a에 해당한다.
연속하는 처음 수를 L의 개수만큼 더한 결과가 N과 같으면 L길이 만큼 처음 수 부터 출력
같지 않으면 L++로 L값을 증가
L값이 100이 넘어도 -1 출력
정답 코드
package com.baekjoon.math.p1024;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int N = sc.nextInt();
int L = sc.nextInt();
/**
* N이 주어졌을 때 자연수(L)로 나누게 되면 그 몫(N/L)의 앞뒤 수를 (L-1)/2 만큼 더하거나 뺏을 때 연속된 수가 나온다.
* 연속된 수의 가장 처음 수 -> N / L - (L - 1) / 2
*/
while (true) {
int min = N / L - (L - 1) / 2;
if (min < 0 || L > 100) {
sb.append(-1);
break;
}
int sum = L * (min * 2 + (L - 1)) / 2;
if (sum == N) {
for (int i = 0; i < L; i++) {
sb.append((min + i) + " ");
}
break;
}
L++;
}
System.out.println(sb);
sc.close();
}
}
참고
728x90
반응형
'Algorithm > 백준' 카테고리의 다른 글
백준 [2589] 보물섬 (JAVA) (0) | 2024.08.10 |
---|---|
백준 [9019] DSLR (JAVA) (0) | 2024.08.09 |
백준 [1010] 다리 놓기 (JAVA) (0) | 2024.08.04 |
백준 [7662] 이중 우선순위 큐 (JAVA) (0) | 2024.07.18 |
백준 [1976] 여행가자 (JAVA) (0) | 2024.07.12 |