배열에 숫자들이 담겨서 입력되면,
숫자들의 각 자릿수를 더한 값이 가장 큰 값을 출력한다.
근데 자릿수를 더한 값이 같은 숫자의 경우는
배열에 담겨서 입력된 숫자가 큰 값이 출력된다.
const arr = [128, 460, 603, 40, 521, 137, 123, 11261];
예제없이 보면 문제가 조금 애매한거 같은데
예제를 보면 쉽다.
128의 자릿수의 합은 11
그다음은 10, 9 ,4,8,11,6,11 이다.
가장 큰 합이 11 인데 11이 3개다
이런 경우에는 128, 137, 11261을 비교해서 가장 큰 수를 출력한다.
그러니 출력되는 값은 11261이다.
function solution(arr) {
let answer = 0;
const sums = [];
let biggest = 0;
for (const num of arr) {
sums.push(
num
.toString()
.split('')
.reduce((val, cur) => Number(val) + Number(cur), 0)
);
}
for (let i = 0; i < sums.length; i++) {
if (sums[i] > biggest) {
biggest = sums[i];
answer = arr[i];
} else if (sums[i] === biggest) {
answer = Math.max(answer, arr[i]);
}
}
return answer;
}
내가 짠 코드다.
for문이 두개다
하나씩 하나씩 뜯어보자.
function solution(arr) {
let answer = 0;
const sums = [];
let biggest = 0;
for (const num of arr) {
sums.push(
num
.toString()
.split('')
.reduce((val, cur) => Number(val) + Number(cur), 0)
);
}
변수들 선언해주고 answer는 0으로 해놓음
sum에다가는 나중에 각 자릿수들 합을 집어 넣을 거임
biggest도 다음 for문에서 사용할 예정
1번째 for문은 숫자들의 각 자릿수합을 합치는 과정이다.
num에다가 toString(), split('')사용해서 숫자들 하나하나 끊은 배열로 만들어준다.
num이 128 이면 ['1','2','8'] 로 된다.
그리고 reduce이용해서 더해준다. 근데 toString을 써서 문자열로 변경돼있으니까,
val 과 cur에 Number써서 숫자로 변경해준다.
function solution(arr) {
let answer = 0;
const sums = [];
let biggest = 0;
for (const num of arr) {
sums.push(
num
.toString()
.split('')
.reduce((val, cur) => Number(val) + Number(cur), 0)
);
}
for (let i = 0; i < sums.length; i++) {
if (sums[i] > biggest) {
biggest = sums[i];
answer = arr[i];
} else if (sums[i] === biggest) {
answer = Math.max(answer, arr[i]);
}
}
return answer;
}
다음 for문을 보면
sums 에서 for문을 돌린다.
biggest 랑 sums[i]를 비교하고
sums[i]가 biggest보다 크면
biggest에 sums[i]를 재할당해주고
answer 에는 arr[i]를 재할당 해준다.
여기서 sums[i]는 arr[i]의 각 자릿수의 합이다.
만약 sums[i]와 biggest가 같다면,
answer와 arr[i]를 비교하고 더 큰 수를
answer에 집어 넣는다.
for문이 끝나면 answer를 리턴한다.
나름 잘풀었다고 생각함.
그리고 센세의 코드를 확인해봤다.
function solution2(arr) {
let answer = 0;
let biggest = 0;
for (const num of arr) {
const sum = num
.toString()
.split('')
.reduce((val, cur) => Number(val) + Number(cur), 0);
if (biggest < sum) {
biggest = sum;
answer = num;
} else if (biggest === sum) {
answer = Math.max(answer, num);
}
}
return answer;
}
for 문 하나로 돌린다.
자릿수 합을 sum에 할당하고
biggest랑 sum 비교하고 sum이 크면 answer 에 num재할당
같으면 answer랑 num이랑 비교해서 큰수를 answer에 재할당 해준다.
센세가 푼 답을 봤을 때,
아 이게 시간복잡도가 더 낮겠구나 라고 생각을 했는데
내가짠 코드가 이중 for문이 아니라
그냥 for문이 두개인거라
O(2N)의 시간 복잡도를 가지는데
빅오표기법에서 계수는 무시되니까
O(N)의 시간복잡도를 가지고
센세의 코드와 시간복잡도는 동일하다.
결국 나도 잘했다는 소리다 헿
'문제풀이 > 인프런 알고리즘 문제풀이' 카테고리의 다른 글
4-5 k번째 큰수 (0) | 2021.12.20 |
---|---|
4-4 졸업선물 (0) | 2021.12.20 |
4-3 멘토링 (0) | 2021.12.20 |
4-2 뒤집은 소수 (0) | 2021.12.14 |
격자판 최대합 (0) | 2021.12.10 |
댓글