프로그래머스/level 1

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

binaryJournalist 2021. 7. 23. 19:30
반응형

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

 

 

 

** Javascript

 

 

1) 나의 첫번째 풀이는 이렇다.

function solution(phone_number) {
    if (phone_number.length === 4) {
        return phone_number;
    } else {
        const numbers = phone_number.replace(/(\d)(\d{4}$)/, "$1-$2").split("-");
        let mask = "";
        for (var i=0; i<numbers[0].length; i++) {
            mask += "*";
        }

        return `${mask}${numbers[1]}`;   
    }
}

 

 

 

 

2) reduce 를 좋아하게 된 지금의 나의 풀이는 이렇다.

function solution(phone_number) {
    return phone_number
        .split("")
        .reduce((acc, curr, index) =>
            (index < phone_number.length - 4) ? acc + "*" : acc + curr, "");
}

 

 

 

3) map 과 join 을 이용해도 된다.

 

function solution(phone_number) {
    return phone_number
        .split("")
        .map((number, index) => (index < phone_number.length - 4) ? "*" : number)
        .join("");
}

 

 

 

추천을 가장 많이 받은 풀이는 정규표현식의 달인의 풀이다.

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function hide_numbers(s) {
  return s.replace(/\d(?=\d{4})/g, "*");
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + hide_numbers('01033334444'));

 

내가 바라던 풀이이긴 했는데 나는 아직 정규식에 미숙하다.

 

 

 

 

그 다음으로 추천을 많이 받은 풀이는 repeat 함수를 이용한 풀이다.

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function hide_numbers(s){
  var result = "*".repeat(s.length - 4) + s.slice(-4);
  //함수를 완성해주세요

  return result;
}

// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + hide_numbers('01033334444'));

 

 

slice 안에 음수를 넣으면 뒤에서부터 숫자를 세는 것으로 알고 있다.

 

 

 

** Java

 

1) 첫번째로 제출한 풀이다

 

import java.util.stream.IntStream;

class Solution {
    public String solution(String phone_number) {
        StringBuilder answer = new StringBuilder();
        
        IntStream.range(0, phone_number.length() - 4).forEach((i) -> answer.append("*"));
        answer.append(phone_number.substring(phone_number.length() - 4, phone_number.length()));

        return answer.toString();
    }
}

 

직사각형 별찍기 문제에서 본 IntStream 과 StringBuilder를 활용하였다.

 

그런데 이 식은 시간이 엄청엄청 오래 걸린다.

 

 

2) 다시 바꿔 본 풀이다.

 

class Solution {
    public String solution(String phone_number) {
        StringBuilder answer = new StringBuilder();

        for (int i = 0; i < phone_number.length(); i++) {
            if (i >= phone_number.length() - 4) {
                answer.append(phone_number.charAt(i));
            } else {
                answer.append("*");   
            }
        }
        return answer.toString();
    }
}

 

이렇게 하면 속도는 확 줄어든다.

 

String.chartAt(인덱스) 는 문자열에서 인덱스가 가리키는 값을 알려준다.

 

 

 

 

3) 이 풀이도 가능하다. 그런데 속도는 두번째 풀이가 훨씬 더 빠르다.

 

import java.util.stream.IntStream;

class Solution {
    public String solution(String phone_number) {        
        StringBuilder answer = new StringBuilder(phone_number);
        
        for (int i = 0; i < phone_number.length() - 4; i++) {
            answer.replace(i, i + 1, "*");
        }
        
        return answer.toString();
    }
}

 

 

 

추천을 많이 받은 다른 사람들의 풀이들을 살펴보면

 

 

class Solution {
  public String solution(String phone_number) {
     char[] ch = phone_number.toCharArray();
     for(int i = 0; i < ch.length - 4; i ++){
         ch[i] = '*';
     }
     return String.valueOf(ch);
  }
}

 

이 풀이는 문자열(String)을 문자 배열(char형 배열)로 만든 뒤 값을 변경하고 나서 다시 문자열로 합쳐주는 것이다.

 

String.toCharArray() : String(문자열)을 char형 배열로 바꾼다.

 

String.valueOf(char) 로 char형 배열을 합쳐서 하나의 String(문자열)로 만듦

 

new String(char) 와 기능은 같다.

 

 

참고:

https://velog.io/@uhan2/java-String.toCharArray-%EC%82%AC%EC%9A%A9%EB%B2%95

 

[Java] - String.toCharArray() 사용법

How to Use - String.toCharArray()

velog.io

 

 

 

 

정규표현식의 달인이라면 프로그램 언어 상관없이 한 줄로 끝낼 수 있다.

 

class Solution {
  public String solution(String phone_number) {
    return phone_number.replaceAll(".(?=.{4})", "*");
  }
}
반응형