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 문을 더 추가해서 예외처리를 해주니 해결되었다
728x90

문제


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

 

코딩테스트 연습 - 나누어 떨어지는 숫자 배열

array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요. divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하

programmers.co.kr

 

코드


function solution(arr, divisor) {
    let answer = [];
    arr.forEach((i) => {
        if (i % divisor === 0) answer.push(i);
    });
    return (answer.length === 0) ? [-1] : answer.sort((a,b) => (a-b));
}

 

후기


  • 문제 이해 : arr[i]들을 divisor로 나누어 떨어지는 값을 오름차순으로 정렬하고, 나누어 떨어지는 값이 없다면 -1을 return
  • 다른 분들의 풀이를 보니 filter를 사용해서도 푸는 방법이 있었다
728x90

문제


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

 

코딩테스트 연습 - 문자열 내 마음대로 정렬하기

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱

programmers.co.kr

 

코드


  • 나의 풀이
    function solution(strings, n) {
        return strings.sort((str1, str2) => 
            str1[n] === str2[n] ? str1.localeCompare(str2) : str1[n].localeCompare(str2[n])
        );
    }​

 

  • 다른 분의 풀이
    function solution(strings, n) {
        return strings.map(a=>[...a][n]+a).sort().map(a=>a.substring(1));
    }​

 

후기


  • 문제 이해 : strings의 각 str에 n번째 인덱스를 기준으로 오름차순하고, 해당 인덱스가 같은 경우에는 str을 기준으로 오름차순하기
  • 처음에는 strings.sort()를 통해 인덱스가 같은 경우에 대해 미리 처리하자는 방법으로 접근을 했으나 그 후에 인덱스에 따른 sort를 못하겠더라.. 그래서 검색을 통해 localeCompare() 이라는 매력적인 함수에 대해 알게 되었다
  • localeCompare() : 두 문자열을 비교하여 정렬상 어떤 문자열인지 알 수 있는 함수로, 기본 사용법은 str1.localeCompare(str2) 이며 음수, 양수, 0 셋 중에 하나의 값을 return하게 된다
    1. 음수 return : str1이 str2보다 정렬상 앞에 오는 경우
    2. 양수 return : str1이 str2보다 정렬상 뒤에 오는 경우
    3. 0 return : str1과 str2가 같은 경우
  • localeCompare()함수와 자바스크립트 sort()함수의 sort()의 매개변수로 오는 함수가 true인 경우에 정렬된다는 성질을 이용하면 간단한 풀이가 나올 수 있다
  • 하지만 나의 풀이는 생소한 localeCompare()를 썼기 때문에 직관적이지 않다는 단점이 있고, 다른 분의 풀이를 보니 map과 sort만 이용하여 간단한 풀이를 하였다. 저 분의 풀이를 보면 기존 strings 앞에 n번째 인덱스의 문자열을 붙이고 그에 따라 정렬을 한 후 substring()함수로 맨 앞에 인덱스를 떼어주는 풀이이다. 아주 신박했다!
728x90

문제


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

 

코딩테스트 연습 - 두 정수 사이의 합

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다. 제한 조건 a와 b가 같은 경우

programmers.co.kr

 

코드


function solution(a, b) {
    let sum = 0;
    let tmp = 0;
    if (a > b) { //swap
        tmp = a;
        a = b;
        b = tmp;
    }
    for (let i=a; i<=b; i++) sum += i;
    return sum;
}

 

후기


  • 문제 이해 : 매개변수로 주어지는 수 a ~ b 까지의 수들의 합을 구하는 문제
  • 문제 조건에 a, b의 대소관계는 주어지지 않는다는 조건을 간과해서 한 번에 통과하지 못했다. a가 b보다 큰 경우에 대해 swap을 이용하여 예외 처리를 해주었다

+ Recent posts