일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 코딩테스트합격자되기
- redux-toolkit
- redux-saga
- programmers
- 테코테코
- axios
- maeil-mail
- JavaScript
- json-server
- 자바
- C++
- 항해99
- sw expert academy
- java
- 이코테
- Get
- 알고리즘
- SW
- useDispatch
- 매일메일
- 프로그래머스
- 리액트
- react
- react-redux
- Python
- Algorithm
- react-router
- createSlice
- redux
- 항해플러스
- Today
- Total
Binary Journey
[프로그래머스] 핸드폰 번호 가리기 본문
출처: 프로그래머스 코딩 테스트 연습, 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
정규표현식의 달인이라면 프로그램 언어 상관없이 한 줄로 끝낼 수 있다.
class Solution {
public String solution(String phone_number) {
return phone_number.replaceAll(".(?=.{4})", "*");
}
}
'프로그래머스 > level 1' 카테고리의 다른 글
[프로그래머스] 평균 구하기 (0) | 2021.07.23 |
---|---|
[프로그래머스] 하샤드 수 (0) | 2021.07.23 |
[프로그래머스] 행렬의 덧셈 (0) | 2021.07.23 |
[프로그래머스] 정수 제곱근 판별 (0) | 2021.07.22 |
[프로그래머스] 숫자 문자열과 영단어 (0) | 2021.07.21 |