Level 1) 핸드폰 번호 가리기, 제일 작은 수 제거하기, 음양 더하기, 없는 숫자 더하기

Doozuu·2023년 2월 6일
0

프로그래머스 (JS)

목록 보기
41/183

📌 문제 1. 핸드폰 번호 가리기

문제 설명

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

제한 조건

phone_number는 길이 4 이상, 20이하인 문자열입니다.
입출력 예
phone_number return
"01033334444" "***4444"
"027778888" "*8888"

풀이

문자열을 배열로 만든 후 앞부분을 splice로 가져와서 별로 만들고, 남은 뒷부분을 합쳐준다.
(slice 말고 splice를 써야 원본 배열에 뒷 부분만 남아있다.)

function solution(phone_number) {
    let arr = phone_number.split('');
    let star = arr.splice(0,phone_number.length-4).map(n => n = "*");
    return star.join('') + arr.join('');
}

참고

  • replace는 문자열에 사용하는 메서드로, 정규표현식을 사용해서 나타내야 한다.(index 이용할 수 없음.)
  • splice와 slice는 배열에 사용하는 메서드이다.
    splice는 원본 배열을 바꾸고, slice는 원본 배열을 바꾸지 않는다.

replace를 이용한 풀이

풀이는 가장 깔끔하지만 조건에 맞는 정규표현식을 쓰기 어려워서 실전에서 생각해내기 어려울 수 있다.(그치만 매우 유용하니까 정규 표현식 더 공부하기~)

function hide_numbers(s) {
  return s.replace(/\d(?=\d{4})/g, "*");
}

repeat과 slice를 이용한 풀이

4 자리를 제외한 나머지 갯수만큼 별을 만들고, 뒷 4자리는 slice를 이용해 가져와 합쳐준다.
(배열로 만들어서 splice 한 것보다 훨씬 간단하다.)

function hide_numbers(s){
  var result = "*".repeat(s.length - 4) + s.slice(-4);
  return result;
}

fill을 이용한 풀이

fill 이라는 메서드를 이용하면 뒷 부분을 따로 처리할 필요 없이 앞 부분만 바로 별로 바꿀 수 있어 편리하다.

function hide_numbers(s){
	return [...s].fill("*",0,s.length-4).join("")
}




📌 문제 2. 제일 작은 수 제거하기

문제 설명

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

제한 조건

arr은 길이 1 이상인 배열입니다.
인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.
입출력 예
arr return
[4,3,2,1][4,3,2]
[10][-1]

풀이

두 가지 방법이 떠올랐는데, 공통적으로 Math.min()을 이용해 최솟값을 구한 다음 filter를 이용하거나 slice & indexOf를 이용하는 것이다.

우선 filter를 이용해 풀어보았는데, 정답이긴 하지만 한 케이스에서 시간이 오래 걸렸다.
코드를 축약시키려고 최솟값을 찾는 과정과 filter하는 과정을 합쳤더니 그런 것 같다.
(코드를 과도하게 축약시키지 말자!)

function solution(arr) {
    return arr.length == 1 ? [-1] : arr.filter(n => n !== Math.min(...arr));
}

최솟값을 찾는 과정과 filter하는 과정을 분리하면 시간이 많이 단축된다.

function solution(arr) {
    let min = Math.min(...arr);
    return arr.length !== 1 ? arr.filter(i => i !== min) : [-1]
}

두 번째로 생각한 방법이 시간이 더 적게 걸렸다.

function solution(arr) {
    arr.splice(arr.indexOf(Math.min(...arr)),1);
    return arr.length < 1 ? [-1] : arr;
}




📌 문제 3. 음양 더하기

문제 설명

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

제한사항

absolutes의 길이는 1 이상 1,000 이하입니다.
absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
signs의 길이는 absolutes의 길이와 같습니다.
signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

입출력 예

absolutes	signs				result
[4,7,12]	[true,false,true]	9
[1,2,3]	    [false,false,true]	0

풀이

반복문을 이용해 false면 음수로 바꿔주며 값을 더해준다.

function solution(absolutes, signs) {
   let answer = 0;
   for(let i=0;i<absolutes.length;i++){
       if(signs[i] === false) absolutes[i] *= (-1);
       answer += absolutes[i];   
   }
   return answer;
}

signs가 boolean으로 주어진다는 점을 이용해 삼항연산자로 나타낼 수도 있다.

function solution(absolutes, signs) {
    let answer = 0;
    for (let i = 0; i < absolutes.length; i++) {
        signs[i] ? answer += absolutes[i] : answer -= absolutes[i]
    }
    return answer;
}

효율이 좋진 않지만 reduce를 이용해 풀 수도 있다.
(속성으로 index도 사용할 수 있다는거 참고하기)

function solution(absolutes, signs) {
   return absolutes.reduce((acc, val, i) => acc + (val * (signs[i] ? 1 : -1)), 0);
}




📌 문제 4. 없는 숫자 더하기

문제 설명

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

1 ≤ numbers의 길이 ≤ 9
0 ≤ numbers의 모든 원소 ≤ 9
numbers의 모든 원소는 서로 다릅니다.

입출력 예

numbers				result
[1,2,3,4,6,7,8,0]	14
[5,8,4,0,6,7,9]		6

풀이

찾을 수 없는 수의 합은 전체 합에서 배열에 있는 수들의 합을 뺀 것과 같다.

0부터 9까지의 합은 공식 n*(n+1)/2 을 이용해 계산해주면 45이고, 배열에 있는 숫자들의 합은 reduce로 구해주면 된다.

function solution(numbers) {
    return 45 - numbers.reduce((a,b) => a+b);
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글