문제 설명
연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
제한사항
1 ≤ num ≤ 100
0 ≤ total ≤ 1000
num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.
나의 코드
class Solution {
public int[] solution(int num, int total) {
int[] answer = new int[num];
int div = total/num;
if(answer.length%2==0) {
answer[answer.length/2-1] = div;
} else if(answer.length%2==1) {
answer[answer.length/2] = div;
}
for(int i=answer.length/2; i>=0; i--) {
answer[i] = div--;
}
for(int i=answer.length/2; i<answer.length; i++) {
answer[i] = div++;
}
return answer;
}
}
예시를 참고해서 머리를 굴려가며 짜봤는데 실패 🥲 어떻게 보면 알고리즘이 아니라 노가다 형식
class Solution {
public int[] solution(int num, int total) {
int[] answer = new int[num];
int temp = 0;
if(total%num == 0) {
temp = total/num - num/2;
} else {
temp = total/num - num/2 + 1;
}
for(int i=0; i<num; i++) {
answer[i] = temp++;
}
return answer;
}
}
저 total/num - num/2
라는 알고리즘을 생각해내는 게 너무 어려웠음
이 후 더 좋은 코드를 고민하다가, 삼항 연산자
로 나타냈을 때 굳이 if ~ else
문을 사용하지 않더라도 한 줄로 표현 가능
class Solution {
public int[] solution(int num, int total) {
int[] answer = new int[num];
int temp = total/num - num/2 + (total % num == 0 ? 0 : 1);
for(int i=0; i<num; i++) {
answer[i] = temp++;
}
return answer;
}
}
다른 사람 코드
class Solution {
public int[] solution(int num, int total) {
int[] answer = new int[num];
int check = num*(num+1) / 2;
int start = (total - check) / num + 1;
for (int i = 0; i < answer.length; i++) {
answer[i] = start + i ;
}
return answer;
}
}
class Solution {
public int[] solution(int num, int total) {
int[] answer = new int[num];
int temp = 0;
for(int i=0;i<num;i++){
temp+=i;
}
int value = (total-temp)/num;
for(int i=0;i<num;i++){
answer[i]=i+value;
}
return answer;
}
}
느낀 점
다양한 방법의 알고리즘으로 접근할 수 있는 문제였다. total
을 num
으로 나눴을 때 0이 아닌 경우를 따로 생각해야 하는 게 좀 골치아픈 문제다 🥲 알고리즘을 떠올리는 데에 많은 시간이 소모되면서 아직 많이 부족하다는 걸 느꼈고, 내가 직접 머리를 싸매서 만들어낸 코드 말고 다른 사람 코드들도 읽고 이해해보며 좀 더 컴퓨팅적 사고를 늘려가야겠다.