728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12947

 

코딩테스트 연습 - 하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하

programmers.co.kr

 

코드


function solution(x) {
    let sum = 0;
    x = String(x).split(""); //숫자 x를 단위 하나씩 배열화
    for (let i of x) {
        i = parseInt(i); //배열에 들어가있는 수는 문자이니 정수화
        sum += i;
    }
    return (parseInt(x.join("")) % sum === 0) ? true : false;
}

 

후기


  • 처음에 parseInt() 대신에 Number()를 사용했는데, 오류가 나길래 두 함수의 차이점에 대해 알아보았다
  • Num(), parseInt() : 문자열을 숫자로 형변환 해주는 함수
  • 공통점 : 둘 다 숫자로 구성된 문자열을 number타입의 숫자로 형변환 해준다
  • 차이점
    • Number() : 문자열에 숫자 외의 문자가 껴 있으면 NaN을 반환
    • parseInt() : 문자열에 숫자 외의 문자가 있어도 숫자까지만 인식하고 형변환 해준다 (하지만, 숫자 외의 문자로 문자열이 시작된다면 마찬가지로 NaN을 반환)
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12948?language=javascript 

 

코딩테스트 연습 - 핸드폰 번호 가리기

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자

programmers.co.kr

 

코드


  • 해결한 풀이
function solution(phone_number) {
    let len = phone_number.length - 4;
    return "*".repeat(len) + phone_number.substring(len);
}

 

  • 처음에 시도했지만 통과하지 못한 풀이
    function solution(phone_number) {
        let front = phone_number.substring(0,phone_number.length-4);
        front.replace(/0-9/g, '*');
        let back = phone_number.substring(phone_number.length-4);
        return front + back;
    }​

 

후기


  • 아직 이유를 찾지 못했는데, 내가 처음에 시도한 코드가 substring으로 문자의 처음부터 끝에서 5번째 문자까지 잘라서 replace와 정규식을 사용해 모든 숫자에 한해 *로 바꿔주는 코드를 작성했는데 자꾸 replace가 적용이 안됐다.
  • 어쩔 수 없이 다른 방법을 찾아보다가 repeat함수를 알게 되었고, 이를 적용하여 풀이를 하였다. 결과적으로 내가 처음에 적용한 코드보다 더 간단하긴 하다
  • repeat() 사용법 : '반복할 문자'.repeat(반복 횟수)
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12917?language=javascript 

 

코딩테스트 연습 - 문자열 내림차순으로 배치하기

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요. s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로

programmers.co.kr

 

코드


function solution(s) {
    const upper = s.split("").filter((i) => (i == i.toUpperCase())).join("");
    const lower = s.split("").filter((i) => (i == i.toLowerCase())).join("");
    return (lower.split("").sort().reverse().join("")) + (upper.split("").sort().reverse().join(""));
}

 

후기


  • 문제 이해 : 문자열 s를 내림차순으로 배치하는데 대문자 < 소문자로 간주한다
  • 소문자와 대문자를 나누어서 각각 sort를 진행하고 최종적으로 합치면 되겠다는 생각을 하였다
  • 문자열 s에서 소문자와 대문자를 나누기 위해서 대소문자를 체크하는 방법을 알아야 했는데, filter함수를 통해 (i == i.toUpperCase()) 를 통해 여부를 알 수 있었다
  • 하지만... 내가 아주 큰 것을 놓치고 있었다. 원래 대문자는 소문자보다 크다고 간주되니 대소문자를 나눌필요없이 문자열 s를 바로 sort().reverse() 적용해주면 한 번에 해결될 문제였다.. ^^
  • 즉, return s.split("").sort().reverse().join(""); 이 한줄로 해결되는 문제였다고 한다
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12926?language=javascript 

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr

 

코드


function solution(s, n) {
    return s.split("").map((i) => {
        if (i === " ") return " "; //공백은 그냥 공백 출력
        let unicode = i.charCodeAt(); //s의 각 문자의 유니코드
        return i.toUpperCase().charCodeAt() + n > 90 ? String.fromCharCode(64 + (n - (90 - unicode))) : String.fromCharCode(unicode + n);
    }).join("");
}

 

후기


  • 문제 이해 : 문자열 s의 각 문자 하나씩을 다 +n만큼 한 문자열로 반환하기 (단, z나 Z의 경우에는 a, A로 반환)
  • 보자마자 아스키코드를 이용해야겠다는 생각이 들었고, 아스키코드 표와 관련함수를 먼저 찾아봤다. 아스키코드를 구하는 함수는 대표적으로 두 가지가 있었다.
  • charCodeAt() : 문자열을 아스키코드 숫자로 바꾸어준다
  • fromCharCode() : 아스키코드 숫자를 문자열로 바꾸어준다
  • 아스키코드 표 참고한 블로그 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=diceworld&logNo=220175224345 
  • 표를 보고 먼저 A,Z,a,z 의 아스키코드 번호를 파악했다 (Z=90, A=65, z=122, a=97)
  • Level1 문제치곤 로직을 짜는게 조금 까다로웠다. 처음엔 쉽다고 생각하여 문자열 s의 각 문자들에 +n 만큼 한 아스키코드 번호를 구하고 해당 번호가 90(Z), 122(z)를 각각 넘으면 A,a로 돌아가 다시 계산하겠단 식으로 로직을 짰지만 90을 넘어가면 소문자 a-z 문자들에도 걸쳐지기 때문에 상당히 복잡해졌다
  • 그래서 우선 각 문자들을 대문자화해서 아스키코드 번호가 Z를 넘어간다면 (64 + (n - (90 - unicode))) 의 로직으로 해당 아스키코드의 문자를 반환하게 풀이했다. 왜 저런 로직을 쓰는지 이해하기 위해서는 아스키코드표를 보며 직접 이해해보는 것이 좋다고 생각한다! 이걸 이해하는 데 은근 시간을 쏟은 문제였다

+ Recent posts