[프로그래머스 코딩테스트 연습문제] 기사단원의 무기 문제 풀이 with 자바스크립트(Javascript) & 자바(Java)

Re_Go·2024년 6월 28일
0

코딩테스트연습

목록 보기
87/106
post-thumbnail

1. 첫번째 문제 풀이(2024-07-01)

해당 문제는 약수를 구하면 되는 간단한 문제인데요. 이전에도 풀었던 문제인 만큼 크게 무리가 없겠다고 생각했는데, 쉽다고 생각한 만큼 효율성 테스트에서 통과를 하지 못했네요... (문제는 약수를 구하는 범위를 2중 반복문, 즉 n의 제곱만큼 돌리다보니 효율성을 챙기지 못한 탓이겠죠.)

그래서 찾아보던 중, 약수를 구하는 범위를 제곱근 까지만 구하면 된다는 내용이 있더군요?
결론만 말하자면 약수를 찾기 위해 1부터 N개 까지 for문을 돌릴 필요 없이 1부터 제곱근 까지를 범위에 두고, 약수의 개수를 찾으면 i와 j 둘 다 약수인 상태가 되는데, 이때 count는 2를 해주면 된다는 것입니다. (내가 써놓고도 뭔 소린지...)

근데 주의할 것은 약수의 제곱근이 개수를 구할 대상의 값이 될 때가 있는데, 이때는 count를 1(약수 자신)만 더해주어야 한다는 것입니다. 그냥 코드를 보시는게 이해가 더 빠를 것 같은데... 그냥 공식으로 외우는게 더 편할 것 같습니다. (어차피 이거 알아도 코테 외에는 따로 쓰지 않을 것 같고, 효율성 문제가 있다지만 이런 공식을 몰라도 기본적으로는 약수를 구하는 공식이 뭔지는 알고 있으니...)

그럼 해당 공식을 적용한 자바스크립트 버전을 소개해 드리겠습니다.

  1. 자바스크립트 버전

//1차 문제 풀이
function solution(number, limit, power) {
    let knighthood = [];
  	//2중 for문을 돌리면서 i를 j로 나눠 나머지가 0이 되는 수, 즉 약수를 찾을 때 count를 ++
    for (let i = 1; i <= number; i++) {
        let count = 0;
        for (let j = 1; j <= number; j++) {
            if (i % j === 0) count++;
        }
      	// 만약 count(약수의 개수)가 limit (전투력 제한)보다 높다면 배열에 power를 push하고 넘지 않는다면 count를 push
        if (count > limit) knighthood.push(power);
        else knighthood.push(count);
    }

  	// reduce 메서드를 이용해 누적 취합 후 result 반환
    let result = knighthood.reduce((acc, cur) => acc + cur);
    return result;
}

// 2차 문제 풀이
  for (let i = 1; i <= number; i++) {
    let count = 0;
    	// 두번쨰 for문은 i의 제곱근 까지만을 범위로 구하는 동안 마찬가지로 나누어 떨어질 때 추가 조건문으로 분기에 따른 count에 값을 저장해줌
        for (let j = 1; j <= Math.sqrt(i); j++) {
            if (i % j === 0) {
              	// j의 제곱이 i, 즉 약수 자기 자신인 경우에는 count를 1만
                if (j * j === i) count++;
              	// 아닌 경우, 즉 둘 다 약수인 경우 count를 2만
                else count += 2;
            }
        }
        if (count > limit) knighthood.push(power);
         else knighthood.push(count);   
    }
    let result = knighthood.reduce((acc, cur) => acc + cur);
    return result;
}

그리고 자바 버전으로 구현한 코드는 다음과 같습니다.

  1. 자바 버전
class Solution {
    public int solution(int number, int limit, int power) {
       // 배열에 들어갈 값은 1부터 들어가므로 배열의 크기를 하나 더 크게 만들어줌
       int[] knighthood = new int[number + 1]; 

        for (int i = 1; i <= number; i++) {
            int count = 0;
            for (int j = 1; j <= Math.sqrt(i); j++) {
                if (i % j == 0) {
                    if (j * j == i) count++;
                     else count += 2;
                 
                }
            }
            if (count > limit) knighthood[i] = power;
            else knighthood[i] = count;
    
        }

        int result = 0;
        for (int i = 1; i <= number; i++) {
            result += knighthood[i];
        }

        return result;
    }
}

2. 자바와 자바스크립트 풀이 차이점

  1. 이 문제의 경우 풀이에는 거의 문제가 없었습니다. 자바의 배열 공간을 하나 더 추가해 주어야 하는 것 말고는... 다만 문제 자체가 생소한 문제이다보니 거기서 시간을 좀 오래 잡아먹은 것 같네요...
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글