※ 저의 풀이는 정답이 아니며 저의 학습 과정을 남기는 목적으로 제작하는 포스팅입니다.
문제
연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
제한사항
- 1 ≤ num ≤ 100
- 0 ≤ total ≤ 1000
- num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.
풀이
일단 로직이 머리속 계산만으로는 되지 않아서 무식한 방법을 사용했다.
answer[0]
answer[1] = answer[0] + 1
answer[2] = answer[1] + 1
answer[3] = answer[2] + 1
...
answer[num] = answer[num-1]+1 = answer[0]+num-1
이라는 식으로 도식화를 해보니 팩토리알이 떠올랐다.
if num==8 total==12
만약에 num8 이라 8개의 인덱스가 생성 되었다면
[1 2 3 4 5 6 7 8] (여기 있는 숫자는 예시이고 아직 배열에 넣지도 않았다.)
로 만들어질 수 있겠다.
결론은
(num)의 ! 값을 total로 뺀 값을 num 으로 나눈 몫만큼 모든 항목을 빼주면 된다.
근데 여기서 우리는 위의 배열을 바로 만들지 않아도 된다.
정확히는 1 2 3 4 5 6 7 8의 값을 생각하지 않아도 된다
이미 1을 베이스로 한 상황이었기 때문에 배열의 시작값만 만들어주면된다.
그 말은
answer[0] = 1 - 위에서 구한 값만 먼저 계산해내면 되고
answer[1] 은 1을 더하고... 이 과정에서만 for문을 주면 된다.
만약에
num 3 total 12 라면
배열은 [1 , 2 , 3]이라고 가정하고 (배열의 시작값을 언제나 1로 시작한다는 뜻이다.
3! 는 6이 나온다. total이 12이기 때문에 6-12=-6이 나온다.
여기서 -6을 3으로 나누고 그 값으로 빼기 때문에
그러면 우리는 answer[0]==1에 1-(-6/3) = 1-(-2) = 1+2로 맞게 실행이 될 것이다.
이제 로직은 간단해졌으니 다시 코드화시켜보자.
class Solution {
public int[] solution(int num, int total) {
int[] answer = new int[num]; // num만큼 answer의 배열을 선언해줍니다.
int temp = 0;
int fact = 0;
// (num 값의 팩토리얼을 구해서 fact 라는 임시 변수에 넣습니다.)
for(int i = 1; i<=num; i++){
fact+=i;
}
temp = 1 - (fact-total)/num;
for(int i = 0; i<num; i++){
answer[i] = temp + i;
}
return answer;
}
}
'코딩이야기 > JAVA' 카테고리의 다른 글
[JSTL] jstl 문법으로 다중 포이치문(c foreach)을 적용하고 싶을 때 (0) | 2023.01.10 |
---|---|
[JAVA] 프로그래머스 코딩테스트 연습 문제 풀이 - 진료 순서 정하기 (0) | 2022.11.07 |
[JAVA] 프로그래머스 문제 풀이 다음에 올 숫자 / 등비수열, 등차수열 판별 (0) | 2022.11.04 |
[JAVA] 사진 파일과 음악 파일의 FileNotFoundException (0) | 2022.11.01 |
[JAVA] java.lang.NullPointerException 에러 (0) | 2022.10.31 |