코딩테스트/프로그래머스

[프로그래머스] 입문 Day 7 문자열, 조건문, 수학, 반복문 (Javascript)

꼽파 2023. 12. 19. 10:36


특정 문자 제거하기

문제 설명

  • 문자열 my_string과 문자 letter이 매개변수로 주어집니다. my_string에서 letter를 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ my_string의 길이 ≤ 100
  • letter은 길이가 1인 영문자입니다.
  • my_string과 letter은 알파벳 대소문자로 이루어져 있습니다.
  • 대문자와 소문자를 구분합니다.

입출력 예

my_string letter result
"abcdef" "f" "abcde"
"BCBdbe" "B" "Cdbe"

 

풀이 1

반복문으로 제외할 글자를 제외하고 출력하도록 함

function solution(my_string, letter) {
    var answer = '';
    // my_string에서 letter가 아닌 것만 출력
    for (i = 0; i < my_string.length; i++) {
        if (my_string[i] != letter) answer += my_string[i]
    }
    return answer;
}

 

풀이 2

split과 join메서드를 이용

function solution(my_string, letter) {
    // const answer = my_string.split(letter)
    // [ 'abcde', '' ], ['', 'C', 'dbe' ]
    const answer = my_string.split(letter).join('')

    return answer;
}

 

join : 배열 모든 요소를 하나의 문자열로 만들어주는 메서드

 

풀이 3

replaceAll 메서드 사용

function solution(my_string, letter) {
    return my_string.replaceAll(letter, "");
}

replaceAll(pattern, replacement) : 해당 문자열(pattern)을 원하는 문자열(replacement)로 변환하는 메서드
→ 여기서 replace(letter, "");는 letter을 빈문자열로 반환하기 때문에 삭제하는 것과 마찬가지이다.

 

풀이 4

정규표현식

function solution(my_string, letter) {
    // 정규 표현식 객체 생성, g는 전역검색(global search)
    let reg = new RegExp(letter, 'g');
    
    // 문자열에서 정규 표현식에 해당하는 부분을 빈 문자열로 대체하여 제거
    return my_string.replace(reg, '');
}

 

주의할 점

  • 해당 문제의 반환값이 만약 배열이었다면 풀이2에서 join 대신 filter( a => a != letter)을 쓰면 됨.

각도기

문제 설명

  • 각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 
  • 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.

    예각 : 0 < angle < 90
    직각 : angle = 90
    둔각 : 90 < angle < 180
    평각 : angle = 180

제한사항

  • 0 < angle ≤ 180
  • angle은 정수입니다.

입출력 예

angle result
70 1
91 3
180 4


풀이 1

if-else 조건문 혹은 삼항연산자

function solution(angle) {
    var answer = 0;
    if (0 < angle && angle < 90) {  // 예각
        answer = 1; 
    } else if (angle == 90) {  // 직각
        answer = 2;
    } else if (90 < angle && angle < 180) {  // 둔각
        answer = 3;
    } else {  // 평각 (180도)
        answer = 4;
    }
    return answer;
}
// 삼항연산자로 표현
function solution(angle) {
    return angle < 90 ? 1 : angle === 90 ? 2 : angle < 180 ? 3 : 4;
}

 

풀이 2

angle이 정수라는 값을 이용하여 filter 사용

function solution(angle) {
    return [0, 90, 91, 180].filter(x => x <= angle).length
    // 0 < angle ≤ 180
    // 0 <= angle ---> 0 < angle < 90, 1
    // 0 <= angle, 90 <= angle ---> angle = 90, 2
    // 0 <= angle, 90 <= angle, 91 <= angle  --> 91 <= angle < 180, 3
    // 0 <= angle, 90 <= angle, 91 <= angle, 180 <= angle  --> 180 = angle, 4
   }

출력값이 1, 2, 3, 4이므로 angle의 범위를 나눠서 배열의 길이를 추출하는 풀이이다.

이런 풀이는 어떻게 생각해내는지 모르겠다.


양꼬치

문제 설명

  • 머쓱이네 양꼬치 가게는 10인분을 먹으면 음료수 하나를 서비스로 줍니다. 양꼬치는 1인분에 12,000원, 음료수는 2,000원입니다.
  • 정수 n과 k가 매개변수로 주어졌을 때, 양꼬치 n인분과 음료수 k개를 먹었다면 총얼마를 지불해야 하는지 return 하도록 solution 함수를 완성해보세요.

제한사항

  • 0 < n < 1,000
  • n / 10 ≤ k < 1,000
  • 서비스로 받은 음료수는 모두 마십니다.

입출력 예

n k result
10 3 124,000
64 6 768,000

 

풀이 1

Math.trunc 이용

function solution(n, k) {
    var answer = 0;
        answer = n * 12000 + ((k - (Math.trunc(n / 10))) * 2000);  // 지불할 금액
    return answer;
}

 

풀이 2

틸드(double tilde) 연산자 활용

function solution(n, k) {
    // 양꼬치 가격 x 인원 수(n) + 음료수 가격 x (음료수 개수 - n을 10으로 나눴을 때 몫) 
    let drink = (k - ~~(n/10)) * 2000;
    let kkochi = n * 12000;
    return drink + kkochi;
}

비트 연산자로 not을 나타내는 '~'를 두 번 쓰면 소수점이 제거됨.


짝수의 합

문제 설명

  • 정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 0 < n ≤ 1000

입출력 예

n result
10 30
4 6

 

풀이 1

반복문과 모듈러 연산자로 합을 구해준다

function solution(n) {
    var answer = 0;
    for (let i = 2; i <= n; i++) {
        if (i % 2 == 0) {
            answer += i
    }}
    return answer;
}

 

풀이 2

등차수열의 합 공식을 이용

function solution(n) {
    // n이하의 짝수의 개수
    var half = Math.floor(n / 2);
    
    // 짝수의 합
    return half * (half + 1);
}
728x90