230111 프로그래머스 약수의 개수와 덧셈(자바/자바스크립트)

샨티(shanti)·2023년 1월 11일
0

코딩테스트

목록 보기
18/35

매일 매일 하루 한 문제씩.
꾸준히 이어가는 코딩테스트 풀이 기록 ✅

오늘 푼 문제는 '약수의 개수와 덧셈'

하루에 한문제씩 코딩테스트를 풀기는 했었는데, 워낙 다른 것들에 치이다보니 하다가 중간에 stop 하거나 풀지 못한 문제들이 있어서 TIL은 오랜만에 쓰는 것 같다.

아쉽게도 javascript에서 for문을 사용했는데 이외의 방법으론 전혀 생각이 나질 않아서 ㅎㅎ
어쨌든! 어려운 문제는 아니었으나 제곱근에 따라 약수의 개수를 파악하는 식을 알았더라면 더 빨리 풀 수 있었던 문제..

코딩테스트를 풀다보면 기본적인 수학, 또는 응용 이론을 알면 빠르게 풀 수 있는 것들이 있는데
본인이 그 이론이나 명제를 알지 못한다고 하더라도 제한 시간 안에 빠르게 풀어내야 하는 것이 코딩테스트기에. 긴장감을 놓치지 말고 방법을 모른다고 해서 중간에 포기하지 말기!

프로그래머스 코딩테스트 약수의 개수와 덧셈


문제


java solution

처음에는 left와 right가 동일한 경우의 수에 대해 guard clause 처럼 if문으로 별도 처리를 해준 후에 결과값을 return 했는데, 코드를 작성하고 보니 굳이 가드클로즈를 하지 않더라도 그 코드 안에서 모든 경우의 수가 해결되었기 때문에 다시 리팩터링 해서 아래와 같은 코드로 문제를 풀었다.

for문이 중첩되어 있어서 if문을 쓰는게 부담스러웠다.
그래서 삼항연산자로 문제를 해결했는데... 이것 역시도 그리 깔끔해보이지는 않는 느낌.

결국 for 중첩을 빼는 것이 더 좋은 방법이라고 생각하는데, 만약 오늘 내가 자바스크립트를 푼 방식대로 stream을 돌렸다면 여기서는 왠지 시간 초과가 뜨거나 했을듯.

좀 더 빠른 for문을 포기할 수 없어 조금 지저분하더라도 아래 코드로 마무리지었다.

class Solution {
    public int solution(int left, int right) {
        int accumulator = 0;

        for (int i = left; i <= right; i += 1) {
            int count = 0;

            for (int j = 1; j <= i; j += 1) {
                count += i % j == 0 ? 1 : 0;
            }

            accumulator += count % 2 == 0 ? i : i * (- 1);
        }
        
        return accumulator;
    }
}

javascript solution

for문 안쓰고... 풀 수 있나? 이 문제...ㅎㅎ
어떻게든 중첩 for문은 쓰고 싶지 않아서 머리를 쥐어짜내다가 left부터 right까지의 수를 포함하는 array를 만든 후에 그 array로 forEach를 하건, map을 하건 해서 for문 하나라도 줄여보자는 의도를 가지고 풀었다.

사실 left에서 right까지의 숫자 갯수만큼 원소를 가진 array를 만드는 건 쉬웠는데, 그 안에 각 숫자를 넣는걸 어떻게 해야하는지 몰랐다.

굉장히 쉬운데도 막상 '이걸 어떻게 하지?' 하면 뚜렷한 방법이 떠오르지 않았음...

약간 시간을 들여 생각하고 있는데 원소의 index가 계속 증가하는 값이니 이를 시작수에 더해주면 되겠다고 판단해서 그 이후로는 문제를 좀 더 쉽게 풀어나간듯!

function makeArray(left, right) {
  return Array(right - left + 1).fill(0).map((_, index) => left + index);
}

function solution(left, right) {
  const array = makeArray(left, right);

  const resultArray = array.map((value) => {
    let count = 0;

    for (let i = 1; i <= value; i += 1) {
      count += value % i === 0 ? 1 : 0;
    }

    return count % 2 === 0 ? value : value * (-1);
  });

  return resultArray.reduce((pre, cur) => pre + cur, 0);
}

어제 다른 기수 동료와도 함께 얘기하면서 느꼈지만,
자바스크립트 문법을 더 빠삭하게 알아야겠다고 생각했다.
사실 튜토리얼을 보면서도 '이게 어떤 도움이 될 것인가?' 라는 의문이 있었는데,
그 튜토리얼을 어떻게 나의 것으로 만들지를 고민하고 또 어떻게 적용할지를 고민하는 것도 결국은 내 몫이겠지.

빨리 타입스크립트도 공부하고 싶고!! 리덕스도 더 익숙해지고 싶고...
취업은 언제나 불안하게 느껴지지만, 그래도 어제보다 더 나은 코드를 작성하고 새로운 방법을 더해가면서 하루 하루 멈추지 않기! 힘!!


profile
가벼운 사진, 그렇지 못한 글

0개의 댓글