프로그래머스 : 신규 아이디 추천
https://programmers.co.kr/learn/courses/30/lessons/72410
문제풀이
이번 문제는 카카오 블라인드 채용의 코딩 테스트에서 출제되었던 문제입니다.
풀이는 문제에 제시한 대로 각 단계를 구현하면 되지만, 푸는 방식이 사람마다 다르기 때문에 가지각색의 풀이가 보입니다.
제 풀이는 그다지 좋은 풀이는 아닌것 같네요.. ㅜㅜ 정규식을 아직 제대로 활용하지 못하기 때문에 풀이를 단순 무식하게 푼 것 같습니다.
if문에 들어간 level은 단순히 단계를 구분하기 위해 사용한 것으로, 제거하여도 문제는 통과합니다.
- new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
- new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
- new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
- new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
- new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
- new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
- new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
코드
function solution(new_id) {
let tmp = new_id.toLowerCase(); // 1단계
let level = 2;
let result = "";
const filterEng = /[a-z]/;
const filterSpec = /[-_.]/;
const filterNum = /[0-9]/;
if(level === 2){ // 2단계
for(let i=0; i<tmp.length; i++)
if(filterEng.test(tmp[i]) || filterSpec.test(tmp[i]) || filterNum.test(tmp[i]))
result += tmp[i];
level ++;
tmp = "";
}
if(level === 3){ // 3단계
let dot = "";
for(let i=0; i<result.length; i++){
if(result[i] === ".") dot = ".";
else{
if(dot === "."){
tmp += dot + result[i];
dot = "";
}
else tmp += result[i];
}
}
level ++;
result = "";
}
if(level === 4){ // 4단계
if(tmp[0] === ".") result = tmp.substr(1,tmp.length-1);
else if(tmp[tmp.length]-1 === ".") result = tmp.substr(0, tmp[tmp.length]-2);
else result = tmp;
level ++;
tmp = "";
}
if(level === 5){ // 5단계
if(result === "") result = "aaa";
level ++;
}
if(level === 6){ // 6단계
if(result.length >= 16 ){
if(result[14] === ".") tmp = result.substr(0,14);
else tmp = result.substr(0,15);
}
else tmp = result;
level ++;
}
if(level === 7){ // 7단계
if(tmp.length <= 2)
while(result.length < 3)
result += tmp[tmp.length-1];
else result = tmp;
}
return result;
}
리뷰
실제 개발에서는 문자열을 다루는 일이 많은데요. 제 풀이는 단순 무식하게 푼 문제라 통과는 했지만 조금 아쉬운 부분이 있었습니다.
다른 정답자 분들의 풀이 중에는 정규식과 체이닝만을 이용해 정말 간단히 푼 방식도 많았는데요. 정규식도 정말 다양하게 사용될 수 있다는 걸 알게 된 것 같습니다..
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
키패드 누르기 / js 풀이 (0) | 2021.07.02 |
---|---|
멀쩡한 사각형 / js 풀이 (0) | 2021.06.29 |
폰켓몬 / js 풀이 (0) | 2021.06.22 |
K번째수 / js 풀이 (0) | 2021.06.21 |
로또의 최고 순위와 최저 순위 / js 풀이 (0) | 2021.06.18 |