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))) 의 로직으로 해당 아스키코드의 문자를 반환하게 풀이했다. 왜 저런 로직을 쓰는지 이해하기 위해서는 아스키코드표를 보며 직접 이해해보는 것이 좋다고 생각한다! 이걸 이해하는 데 은근 시간을 쏟은 문제였다
728x90

문제


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

 

코딩테스트 연습 - 문자열 내 p와 y의 개수

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를

programmers.co.kr

 

코드


function solution(s){
    const count_p = s.match(/p|P/g); //p의 개수 , /p/gi
    const count_y = s.match(/y|Y/g); //y의 개수 , /y/gi
    if ((!count_p) && (!count_y)) return true;
    else if ((!count_p) || (!count_y)) return false;
    else return (count_p.length === count_y.length) ? true : false;
}

 

후기


  • 문제 이해 : 문자열 내 p와 y의 개수를 비교해 같으면 true, 다르면 false를 return하고, p,y가 모두 없으면 항상 true를 return하기
  • 문제를 보자마자 정규식을 이용하여 p,y의 개수를 구해야겠다는 생각을 하였고, 이를 활용하기 위해 match함수를 사용했다
  • match() : 문자열 안에 특정 단어를 찾고 싶을 때 사용하는 함수로서 특정 단어가 포함되어 있는지 여부를 알 수 있다. 나아가 특정 단어를 찾는 데 그치지 않고 정규식을 이용하여 특정 패턴을 찾는 것도 가능하다
  • match함수 사용법 : string.match("찾고싶은 특정 단어") >> 특정 단어를 string안에서 찾게 되면 이를 return 함
  • 응용하여 match 함수 뒤에 length를 붙이면 특정 단어의 개수를 알 수 있다
  • 주의할 점) 정규식을 통해 반환된 변수 count_p, count_y의 경우에는 반환할 것이 없으면 빈 배열인 []가 아니라 null이 반환되기 때문에 length가 적용되지 않는다
  • 이 문제는 조건이 까다롭진 않았지만 p만 있는 경우, y만 있는 경우, 둘다 없는경우, 둘 다 있는 경우 등 고려해야 할 것들이 은근 많아서 예외처리를 하느라 if 문을 많이 쓴 것이 좀 아쉬웠다
  • 히든 테스트 케이스 2,3 번과 29,30번이 세트마냥 같이 오류가 나곤 했었는데 if, else if 문을 더 추가해서 예외처리를 해주니 해결되었다

+ Recent posts