프로그래머스 [히샤드 수] / [같은 숫자는 싫어]

맹뿌·2021년 7월 13일
0

알고리즘 문제

목록 보기
5/5

1. 히샤드 수

💬 문제 요약

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 함. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해야 함.

💬 풀이 방법

function solution(x) {
    var answer = true;
    let temp, sum = 0;
    
    // 모든 자릿수 숫자를 더해야하기 때문에 일의 자리의 수는 10으로 나눈 나머지를,
    // 백의 자리 수는 (x / 100)에서 (x / 1000) * 10를 빼고 sum에 더해주고,
    // 십의 자리 수는 (x / 10)에서 (x / 100) * 10을 빼고 sum에 더해주는 식으로
    // 코드 구성
    if(x < 10000) {
        for(let i = 1000; i >= 10; i /= 10) {
          // 몫이 10이 넘을 때만 위의 주석대로
        if(Math.floor(x / i) >= 10) {
            sum += Math.floor(x / i) - 10*(Math.floor(x / (i*10)));
        }
          // 10이 넘이 않으면 그냥 sum에 더해줌
        else
            sum += Math.floor(x / i);
        }
        
     sum += (x % 10);
     answer = (x % sum) ? false : true;
    }
    
    else // x가 10000일때는 무조건 true.
        answer = true;
    
     return answer;
}

ㅋ 상당히 복잡하다..
그렇지만 지금 내 머릿속에 있는 것들로는 이게 최선인 것 같다...
코드 설명은 위의 주석들을 참고하면 된다.

2. 같은 숫자는 싫어

💬 문제

💬 풀이 방법

function solution(arr)
{    
    for(let i = 0; i < (arr.length-1); i++) {
        for(let j = (i+1); j < arr.length; j++) {
            if(arr[i] === arr[j]) {
                arr.splice(j, 1);
                j--;
            }
            else
                break;
        }
    }

    return arr;
}

j--; 가 제일 관건이었다.
arr가 [5, 5, 5, 6, 3] 이라고 가정해보자.
if문에서 arr[0]과 arr[1]을 비교하고, 같으면 arr[1]을 제거한다. 주어진 arr에서는 arr[0], arr[1], arr[2]가 전부 5로 같기 때문에 일단 arr[1]의 5는 제거가 된다.
이 때 문제는 다음번의 5가 arr[1]이 되는데 arr[1]은 이미 한 번 비교를 했기 때문에 원래 arr[1]에 있던 5는 제거가 되지만, 그 다음에 arr[1]이 된 5는 제거가 되지 않는다.
따라서 j를 하나 감소해주어 제거가 된 인덱스에 들어온 수부터 다시 비교하게끔 만들어주었다.

여기서 또 문제는 테스트는 다 통과했는데 효율성 테스트가 전부 fail이 떴다는 것이다.. 허허................ 언젠간 이것도 해결할 수 있을만큼 머리가 자바스크립트로 가득 차겠지ㅎㅎㅎ

🎁 문제 출처

profile
무엇이든 할 수 있고, 무엇이든 될 수 있는

0개의 댓글