코드 그라데이션
[Lv.0] 길이에 따른 연산 본문
https://school.programmers.co.kr/learn/courses/30/lessons/181879
문제 설명
정수가 담긴 리스트 num_list가 주어질 때,
리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을
10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요.
제한 사항
입출력 예
입출력 예 설명
아이디어
- 11 이상이면 더하고, 10 이하면 곱한다. <= 이 조건을 먼저 검사하고, 실제 작업을 수행하는 게 맞다.
- 풀이 처음에는 내가 for문을 바깥에 쓰고, num_list.length만큼을 도는 걸 수행하려고 했다.
초기 코드
class Solution {
public int Solution(int[] num_list) {
int answer = 0;
if (num_list.length>=11) {
for (int i=0; i<num_list.length;i++) {
int count = 1; // 더한 횟수
int total = 0; // gkq
total += count;
count++;
}
}
return answer;
}
}
- 이것의 문제
- 지금 count와 total은 반복이 진행되어도 계속 유지되어야 하는 값이다.
- 근데 지금 보면 반복문이 수행될 때마다 계속 다시 태어나고 있으니, 반복문 밖으로 빼줄 필요성이 있다.
- 지금 count를 계속 더하는 것이 아니라, 모든 원소의 합을 구하는 것이다.
조금 고쳐본 코드
class Solution {
public int Solution(int[] num_list) {
int answer = 0;
int total = num_list[0]; // 합
if (num_list.length>=11) {
for (int i=0; i<num_list.length;i++) {
total += num_list[i];
i++;
}
}
return answer;
}
}
- 이렇게 바꾸었는데, 사실 여기서는 i가 계속 변하고 있으므로, 사실상 i++; 작업은 필요가 없는게 된다.
- i가 0부터인데, 여기서 초기값도 0부터이다.
- 이렇게 되면 첫 번째 원소가 아마 두 번 세어지게 될 것이다.
- 그래서 total을 아까처럼 0으로 하거나, i를 1부터 시작하게 하는 식으로 개선하면 이런 문제가 사라질 것이다.
- 초기값 0은 이미 처음부터 들어가므로, i를 1부터 시작하게 만드는 것이 더 깔끔하지 않을까 싶다.
나의 최종 답안
class Solution {
public int solution(int[] num_list) {
//11이상이면 더하고, 10이하면 곱한다.
int answer = num_list[0]; // 합
if(num_list.length>=11) {
for(int i=1;i<num_list.length;i++) {
answer += num_list[i];
}
}
else {
for(int i=1;i<num_list.length;i++) {
answer *= num_list[i];
}
}
return answer;
}
}
팁
- 더하기 할 때는 0부터 시작하는게 좋고,
- 곱하기는 0을 곱하면 항상 0이 나오니까, 1부터 시작하는 게 좋다.
- 그런데 이 풀이에서는 첫 번째 원소를 아예 초깃값으로 설정했기 때문에 이러한 더하기 상황을 고려하지 않아도 되었다.
728x90
'Java > 알고리즘' 카테고리의 다른 글
[Lv.0] 중앙값 구하기 (0) | 2023.05.27 |
---|---|
[Lv.0] 첫 번째로 나오는 음수 (0) | 2023.05.25 |
[Lv.0] (2문제) 소문자로 바꾸기, 대문자로 바꾸기 (0) | 2023.05.25 |
[Lv.0] 삼각형의 완성 조건 (0) | 2023.05.18 |
[Lv.0] 특정 문자 제거하기 (0) | 2023.05.18 |
Comments