TIL 12일차 - Javascript 코딩 테스트 풀이 답안 정리(3)

박찬웅·2023년 2월 17일
0

항해99

목록 보기
17/105

23년 2월 17일

  • 모든 문제의 출처는 프로그래머 스쿨에서 가져왔으며, 아래 적은 코드들의 답은 되도록 스스로 풀려고 생각했으나, 모르는 것들은 팀원들과 같이 풀거나, 기술매니저님한테 도움을 받았습니다.

23. 자연수 뒤집어 배열로 만들기

자연수 뒤집어 배열로 만들기 문제 푸는 곳
해답 및 설명

function solution(n) {
    var answer = [];
    var arr = String(n) // 숫자를 문자열로 변환
    arr = arr.split(''); // 각 문자마다 배열로 변경
    arr = arr.reverse(); // 배열을 뒤집기

    for (let i = 0 ; i < arr.length; i++) {
        answer.push(Number(arr[i])); // arr 배열 문자를 하나씩 넣으면서 숫자로 변환
    }
    return answer;
}

우선 숫자를 그대로 쪼갤 수는 없기 때문에 문자열로 바꾸는 String함수를 이용해서 n을 문자열로 바꾼다. 그리고 나서 각 문자 마다 배열을 만들어 주는 split 함수를 이용해서 문자마다 배열로 바꿔주고 reverse 함수를 통해서 배열을 뒤집으면 되었다. 이제 알파벳 문자를 하나씩 붙여야 하기 때문에 for문을 사용해서 push 함수를 이용해서 하나씩 붙힌다. 다만 그냥 붙히면 여전히 문자열 이기 때문에 number 함수를 이용해서 문자열을 숫자로 변환을 해줘야 된다.
이 문제 같은 경우에는 적절한 함수 메소드를 많이 활용해야 풀 수 있었던 문제였다. 어제 풀었던 21번과 못지않게 나름 고전한 문제였으며, 팀원들의 조언을 통해서 겨우 풀 수 있었던 문제였다.

24. 정수 내림차순으로 배치하기

정수 내림차순으로 배치하기 문제 푸는 곳
해답 및 설명

function solution(n) {
    var answer = '';
    n = String(n); // 숫자를 문자로 변환
    n = n.split(''); // 문자열을 배열로 변경
    n.sort(function (a, b) {
        if (a > b) return -1; 
  }); //내림차순으로 정렬
    for (let i = 0; i < n.length; i++) {
        answer += n[i];
        answer = parseInt(answer); // 문자열을 숫자로 변환
    }
    return answer;
}

각 숫자의 자리수를 이동시키려면 결국엔 배열을 만들어야 하기 때문에 숫자를 문자열로 바꾸는 String과 그 문자열을 자릿수마다 배열로 만드는 split를 사용하면 된다. 그리고 이전에서 많이 사용했던 sort함수를 통해서 내림차순 정렬을 해주면 된다. 그런 다음에는 for문으로 숫자 하나씩 추가해주고 난 뒤에 문자열을 숫자로 바꿔주는 parseInt 함수를 이용해서 돌려주면 되었다.
방금 풀었던 23번과 유사한 부분이 많았던 문제였다. 23번이랑은 다르게 24번은 완성은 배열 형태가 아닌 숫자 형태로 완성해야 그런지 배열을 유지해야하는 23번이랑은 다르게 24번은 숫자로 돌리는거라 23번에 비해서 쉽게 푼 것 같다.

25. 정수 제곱근 판별

정수 제곱근 판별 문제 푸는 곳
해답 및 설명

function solution(n) {
    var answer = 0;
    let sqrt = Math.sqrt(n); // n의 제곱근을 나타내는 sqrt 함수
    // 1로 나눠서 나머지가 0일때 -> 정수인지 아닌지 판별
    if (sqrt % 1 === 0) {
        answer = (sqrt + 1) * (sqrt + 1); // 정수면 x+1을 더하고 제곱
    } else {
        answer = -1; // 정수 아니면 -1로 리턴
    }
    return answer;
}

정수를 제곱근으로 바꿔주는 Math.sqrt 함수를 이용해서 sqrt 변수를 선언 해줬다. 그리고 나서 1로 나눠서 나머지가 0이면 그게 곧 정수인 것을 이용해서 맞으면 1을 더하고 제곱해주고 틀리면 -1리턴 하면 간단한 문제였다.
Math.sqrt 함수를 구글링을 해서 풀어보니 무난하게 풀 수 있었다.

26. 자연수 뒤집어 배열로 만들기

자연수 뒤집어 배열로 만들기 문제 푸는 곳
해답 및 설명

function solution(arr) {
    if(arr.length === 1) return[-1]; // arr 길이가 1이면 [-1]로 반환
    
    let i = 0; // 배열의 첫항 정의
    // 두번째 항부터 끝항까지 순서대로 첫항과 비교해 가작 작은 숫자를 찾기
    for (let j = 1; j < arr.length; j++){
        if (arr[j] < arr[i]) {
            i = j; // 더 작은 숫자가 나오면 i번째 항으로 변경
        }
    }
    arr.splice(i, 1); // 가장 작은 i번째 항 부터 1개만 제거 = 가장 작은 숫자 제거
    return arr;
}

arr 항이 1개 이상 기준이기 때문에 먼저 항이 1개이면 그대로 [-1]를 반환 해준다. 그런 다음에 첫항과 비교해서 두번째 항부터 끝항까지 for문으로 둘려서 가장 작은 숫자의 인덱스 번호를 조건을 찾는다. 그리고 나서 splice 함수를 이용해 가장 작은 인덱스 하나를 제거 하면 된다.

ps. 오늘 푼 기본 문제에서 유일하게 못 풀어서 결국 다른사람의 해답을 보고 이해하였다. 처음에는 sort 함수를 이용해서 내림차순으로 정렬 한 다음에 pop 함수를 이용해서 가장 마지막 항을 제거하는 것으로 진행했는데 테스트케이스는 맞았으나 정확성이 하나도 안맞아서 틀렸다. 배열을 정렬을 하라는 말이 없었기에 sort 함수를 안쓰고 작은 항을 찾아야 한다는 것 때문에 많이 답답 하였고, 그 기준을 만드는게 잘 몰라서 결국 해결하지 못했고, 심지어 다른사람의 해답들도 거의 이해하지 못했을 정도로 어려웠던 문제였다. 그나마 여기 적힌 코드가 이해를 해서 해당 코드를 적었다. 어제 21번 같은 경우엔 당일엔 풀지 못했지만 나중에 가서 다시 푸는데는 성공했는데, 이건 20번째랑 못지 않게 스스로 풀지 못한 문제가 되었다.

27. 콜라츠 추측

콜라츠 추측 문제 푸는 곳
해답 및 설명

function solution(num) {
    if (num === 1) {
        return 0; 
    } // 값이 1이면 그대로 0 출력

    for(let i = 0; i <= 500; i++){
        if (num === 1) {
            return i;
            break; // for문을 돌려 값이 1이 나오면 i값을 출력하고 break
        } else if (i === 500) {
            return -1; // i가 500이면 -1로 반환
        } else if (num % 2 === 0) {
            num = num / 2 // num이 짝수면 2로 나누기
        } else {
            num = num * 3 + 1 // num이 홀수면 3을 곱하고 1을 더함
        }
    }
}

먼저 숫자가 1이면 그대로 0으로 반환해준다. 그리고 나서 총 4가지의 기준을 만들어야 하는데 가장 먼저 i번째 만큼 진행되서 1이 왼성되면 i를 반환 해준다음에 braek문을 통해서 for문을 완전히 빠져 나오게 해야 한다. 두 번째는 i가 500번째에 도달하면 -1을 반환을 하게 만들다. 이렇게 최종적으로 완료 되었을때 반환식을 사전 조건 만들고 그 다음에 짝수일때는 2로 나누고 홀수면 3을 곱하고 1을 더하는 조건을 만들면 되었다.
이 문제 같은 경우에는 if문 조건을 어떤 순서부터 먼저 조건을 실행을 히야 할 지가 중요하였고 break문 활용이 필요로 했었다. 처음에는 홀짝 일때 기준으로 실행하니까 내가 원하는 기준으로 잘 안되서 푸는데는 조금 시간이 걸렸던 문제였다.

28. 하샤드 수

하샤드 수 문제 푸는 곳
해답 및 설명

function solution(x) {
    let number = x.toString(); //숫자를 문자열로 변환
    let intPlus = 0; //각 자리수마다 더할 변수 생성
	// 각 자리수마다 모두 더하기
    for (let i = 0; i < number.length; i++) {
        intPlus += parseInt(number[i]); // 문자열을 숫자로 변환
    }
  	// 정수로 나머지가 딱 떨어지는 기준
    if (number % intPlus === 0) {
        return true;
    } else {
        return false;
    }
}

어제 풀었던 22번을 참고해서 각 자리 숫자마다 모두 더해야 하기 때문에 number 변수에다 정수였던 x를 문자열로 바꿔주었다. 그런 다음에 모두 더한 다음에 parseInt로 숫자로 변환을 해 주면 된다. 이제 number 숫자와 각자리마다 더한 intPlus를 나눠서 나머지가 0이면 그게 곧 정수 이기때문에 정수면 true, 아니면 false를 출력하면된다.
어제 풀었던 22번 문제가 도움이 많이 되어서 이 문제는 여기서 조금만 응용하면 쉽게 풀 수 있었다.

알게 된 점

오늘은 어제랑 다르게 많은 문제를 풀지 못하였다. 전반적으로 20번대부터는 난이도가 급격하게 올라가서 이제는 기존처럼 for문과 if문만 쓰는 걸로는 더이상 해결이 잘 안되고, 함수 메소드들을 적절하게 잘 활용해야 풀 수 있었던 문제들이 많았다. 그래서 한 문제당 기본으로 30분에서 1시간은 기본적으로 걸렸고, 심지어 26번은 2시간 넘게 고민했는데도 풀지 못하였다.
또한 오늘부터 팀이랑 같이 의논하는 것 말고도 코딩테스트 스터디가 만들어져서 들어가서 공부를 하기 시작하였다. 보통 아침이나 오후때는 개인적으로 공부를 많이 하다 보니까 지루 할텐데, 그걸 방지하기 위해서 스터디 팀원들이랑 같이 공부를 하는 시간을 가졌다. 원래 조 팀별 만 비교 했었지만, 여기에 추가적으로 스터디 팀원들이랑 푼 것들을 비교하면서 다양하게 푸는 방법을 알게 되었다.
그래도 초기의 목적인 주어진 28문제는 모두 보는데 마무리 하여서 성취감을 얻게 된 것 같다.

앞으로 할 일

내일은 월요일에 코딩테스트 시험이 있는데 그거에 대한 모의고사 3문제를 집중 적으로 풀고 시간이 남으면 추가 챌린지 문제도 조금 더 풀어 볼 예정이다.

profile
향해 13기 node.js 백앤드

0개의 댓글