일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
- 프로그래머스 #JAVA #코딩테스트 #다음에 올 숫자 #코딩
- JAVA #객체지향언어 #절차지향언어 #코딩 #Python #C #C++ #객체지향 #절차지향
- 프로그래머스 #자바 #java #코딩테스트 #연속된 수의 합 #코딩
- Today
- Total
Javadocs
[ Programmers ]Lv.0 연속된 수의 합 (JAVA) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/120923
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[ 문제 설명 ]
연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num 개를 더한 값이 total 이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution 함수를 완성해보세요.
[ 제한사항 ]
- 1 ≤ num ≤ 100
- 0 ≤ total ≤ 1000
- num 개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.
[ 입출력 예 ]
num | total | result |
3 | 12 | [3, 4, 5] |
5 | 15 | [1, 2, 3, 4, 5] |
4 | 14 | [2, 3, 4, 5] |
5 | 5 | [-1, 0, 1, 2, 3] |
import java.util.Arrays;
class Solution {
public static int[] solution(int num, int total) {
int[] answer = new int[num]; // 배열 answer 생성
int sum = 0;
int start = 0;
for (int i = 1; i < num; i++) {
sum += i;
}
// 첫번째 항을 구하는 식.
start = (total - sum) / num;
// answer 배열에 반복문을 통하여 배열에 요소 추가.
for (int j = 0; j < num; j++) {
answer[j] = start + j;
}
System.out.println(Arrays.toString(answer));
return answer;
}
}
[ 풀이 설명 ]
Ex. num(항의 개수) = 5, total(등차수열의 합) = 15 라 가정해보자.
공차가 1인 등차수열을 생각해서 각 항은 x, x+1, x+2, x+3, x+4 이고 각 항들을 더하면 5x + 10이 나온다.
즉, 5x + 10 = 15로 정리가 된다.
여기서 일반식으로 정리해본다면
첫번째 for문의 경우는 예시에서 '10', 일반식에서는 '시그마'를 구하는 식이고 그 결과값을 sum 이라고 정의해준다.
그리고 일반식에서 첫째항 start를 남기고 전부 이항을 시켜준다 => start = (total - sum) / num
그 다음 두번째 for문에서 첫째항(start)을 넣어서 배열 answer을 구하여 준다.
[ 두번째 풀이 ]
class Solution {
public int[] solution(int num, int total) {
int[] answer = new int[num];
int sum = num * (1 + num) / 2; // 첫번째항을 '1'로 정하고 num까지의 합
int start = (total - sum) / num; // 총합에서 sum을 뺀 후 남은 수만큼 균등하게 분배하기 위함
for(int i=1; i<num+1; i++){
answer[i - 1] = i + start;
}
return answer;
}
}
[ 풀이 설명 ]
두번째 풀이는 등차수열의 합 공식을 사용해 보려고 한다.
1)
먼저 공식을 살펴보면 등차수열의 합 = 항의 개수 * (첫째항 + 마지막항) / 2 이다.
그리고 여기서 첫째항을 1이라고 가정할 것이고 그렇게 되면 항의 개수와 마지막항의 수는 같을 것이다.
다시 정리해보면 등차수열의 합(sum) = 항의 개수(num) * (1 + 마지막항(num)) / 2 로 정리할 수 있다.
2)
다음으로 이용할 개념은..
문제에서 주어진 예시를 들어 num = 3, total = 12를 이용해보자.
먼저 위에 1) 에서 첫째항을 '1'이라고 가정한다고 했다. 그래서 1부터 항의 개수가 3개인 수 까지 합을 구한다면
1 + 2 + 3 = 6이 나오게 되고 문제에서 주어진 합은 12이다. 여기서 우리가 구한 '6'은 문제에서의 합 '12' 보다 6이 부족하고 이 6을 균등하게 3개의 항으로 '2' 씩 분배하여 더해준다. 그러면 3 + 4 + 5 = 12가 나오게 된다.
1), 2) 개념을 정리하여 코드로 작성하면 아래와 같이 나온다.
int sum = num * (1 + num) / 2;
int start = (total - sum) / num;
나온 결과를 이용하여 for문을 이용하여 배열 answer에 넣어준다.
'SelfStudy > Programmers(코딩테스트)' 카테고리의 다른 글
[ Programmers ] 문자열 밀기 (Java) (0) | 2023.03.17 |
---|---|
[Programmers] OX 퀴즈 (0) | 2023.03.15 |
[ Programmers ] Lv.2 n^2 배열 자르기 (1) | 2023.03.13 |
[ Programmers ] Lv.0 제곱수 판별하기(Java) (0) | 2023.03.10 |
[ Programmers ]Lv.0 다음에 올 숫자 (JAVA) (0) | 2023.02.22 |