본문 바로가기
문제풀이/인프런 알고리즘 문제풀이

4-1 자릿수의 합

by dev_kong 2021. 12. 14.
728x90
728x90

배열에 숫자들이 담겨서 입력되면,

숫자들의 각 자릿수를 더한 값이 가장 큰 값을 출력한다.

근데 자릿수를 더한 값이 같은 숫자의 경우는

배열에 담겨서 입력된 숫자가 큰 값이 출력된다.

 

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)의 시간복잡도를 가지고

센세의 코드와 시간복잡도는 동일하다.

 

결국 나도 잘했다는 소리다 헿

728x90
728x90

'문제풀이 > 인프런 알고리즘 문제풀이' 카테고리의 다른 글

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

댓글