devlog of ShinJe Kim

[javascript] 프로그래머스|Level1|핸드폰 번호 가리기

|

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

제한 조건 s는 길이 4 이상, 20이하인 문자열입니다.

나의 풀이

function solution(phone_number) {
    return phone_number.replace((phone_number.substring(0, phone_number.length-4)), '*'.repeat(phone_number.length-4));
}

다른 사람의 풀이 1

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

다른 사람의 풀이 2

function solution(phone_number){
  var result = "*".repeat(phone_number.length - 4) + phone_number.slice(-4);

  return result;
}

replace와 repeat 함수를 써서 코드양을 줄이기는 한 것 같은데 실행시간이 생각보다 너무 오래 걸렸다. 정규식으로 풀어내는 방법과 slice 함수를 쓰는 풀이도 있었다. 정규식은 정말 다양한 문제를 간단하게 해결해주는 것 같다.

[javascript] 프로그래머스|Level1|자릿수 더하기

|

문제 설명 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.

제한 조건 N의 범위 : 100,000,000 이하의 자연수

나의 풀이

function solution(n)
{
    var answer = 0;
    var str = n.toString();
    var str_split = str.split('');

    for(var i=0; i<str_split.length; i++){
        answer += parseInt(str_split[i]);
    }

    return answer;
}

다른 사람의 풀이

function solution(n)
{
    var answer = 0;
    var m=String(n);

    for(var i=0; i<m.length; i++){
        answer+=parseInt(m[i]);
    }
    return answer;
}

굳이 split 함수를 쓰지 않아도 되는 것이었다는 것을 다른 사람의 풀이를 보고 알게 되다니..ㅠ 능숙해지는 방법은 연습 연습 연습뿐이다.

[javascript] 프로그래머스|Level1|두 정수 사이의 합

|

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

제한 조건

  • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
  • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
  • a와 b의 대소관계는 정해져있지 않습니다.

나의 풀이

function solution(a, b) {
    var answer = 0;

    if(a>b){
        var temp = a;
        a = b;
        b = temp;
    }

    for(var i=a; i<=b; i++){
        answer += i;
    }

    return answer;
}

다른 사람의 풀이

function solution(x){
  return (a+b)*(Math.abs(b-a)+1)/2;
}

절대값을 반환하는 함수와 숫자의 합을 구하는 공식으로 이렇게 간단하게 구현할 수 있는 것을..ㅜ

[javascript] 프로그래머스|Level1|같은 숫자는 싫어

|

문제 설명 배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 배열 arr에서 제거 되고 남은 수들을 return 하는 solution 함수를 완성해 주세요. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를들면

  • arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  • arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

제한 조건

  • 배열 arr의 크기 : 1,000,000 이하의 자연수
  • 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

나의 풀이

function solution(arr)
{
    var answer = [];
    for(var i=1; i<arr.length; i++){
        var j=i-1;
        if(arr[i] !== arr[j]){
            answer.push();
        }
    }
    return answer;
}

다른 사람의 풀이

function solution(arr)
{
    return arr.filter((val,index) => val != arr[index+1]);
}

filter 함수 사용법을 알게 되었다. 아직 완벽하게 이해가 되지는 않는데 이것 저것 넣어보고 연습하는 중이다.

[javascript] 프로그래머스|Level1|문자열 다루기

|

문제 설명 문자열 s의 길이가 4혹은 6이고, 숫자로만 구성되있는지 확인해주는 함수, solution을 완성하세요. 예를들어 s가 “a234”이면 False를 리턴하고 “1234”라면 True를 리턴하면 됩니다.

제한 조건 s는 길이 1 이상, 길이 8 이하인 문자열입니다.

나의 풀이

function solution(s) {
    var regex = /^[0-9]*$/;
    return ((s.length == 4 || s.length == 6) && (regex.test(s))) ? true : false;
}

다른 사람의 풀이

function solution(s){
  var regex = /^\d{6}$|^\d{4}$/;
  return regex.test(s);
}

전체를 정규식으로 할 생각은 못했는데, 정규식으로 하니 엄청 간단해졌다. 정규식을 더 연습해야지.