문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/72410
문제 설명
신규 유저가 입력한 아이디가 new_id라고 한다면, 다음 규칙에 따라 변경이 됩니다.
1단계. new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계. new_id에서 알파벳 소문자, 숫자, 빼기( - ), 밑줄( _ ), 마침표( . )를 제외한 모든 문자를 제거합니다.
3단계. new_id에서 마침표( . )가 2번 이상 연속된 부분을 하나의 마침표( . )로 치환합니다.
4단계. new_id에서 마침표( . )가 처음이나 끝에 위치한다면 제거합니다.
5단계. new_id가 빈 문자열이라면, new_id에 "a"에 대입합니다.
6단계. new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표( . )가 new_id의 끝에 위치한다면 끝에 위치한 마침표( . ) 문자를 제거합니다.
7단계. new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
제한 사항
- new_id는 길이 1 이상 1,000 이하인 문자열입니다.
- new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
- new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.
✅ Code - 성공
function solution(new_id) {
var answer = '';
// 1단계
new_id = new_id.toLowerCase();
// 2단계
const pos_str = /[a-z0-9-_.]/;
for (let str of new_id) {
if (pos_str.test(str)) answer += str;
// 3단계
let idx = 0
while (idx < answer.length - 1) {
if (answer[idx] === '.' && answer[idx + 1] === '.') answer = answer.slice(0, idx) + answer.slice(idx + 1);
else idx ++;
}
// 4단계
if (answer[0] === '.') answer = answer.slice(1);
if (answer[answer.length - 1] === '.') answer = answer.slice(0, answer.length - 1);
// 5단계
if (!answer) answer += 'a';
// 6단계
if (answer.length >= 16) {
answer = answer.slice(0, 15);
if (answer[answer.length - 1] === '.') answer = answer.slice(0, answer.length - 1);
}
// 7단계
while (answer.length <= 2) answer += answer[answer.length - 1];
return answer;
}
※ 참고 (정규표현식을 이용한 풀이)
function solution(new_id) {
var answer = ''
answer = new_id.toLowerCase() // 1단계
.replace(/[^a-z0-9-_.]/g, '') // 2단계
/*
[^...] - [^] : 대괄호 안에서 ^을 쓰면 제외의 뜻, ex) [^a-z] : 소문자 알파벳을 제외한 모든 문자
- 대괄호 안에서 -_. 같은 특수문자는 문자 그대로 해석
a-z : 소문자 알파벳 (a부터 z까지)
0-9 : 숫자(0부터 9까지)
g : 모든 검색 결과를 반환
*/
.replace(/\.+/g, '.') // 3단계
/*
\ = 문자 그대로 해석 ex) \. : 마침표(.) 그대로 해석
+ = 바로 앞에 요소가 1번 이상 반복
*/
.replace(/^\.|\.$/g, '') // 4단계
/*
^ : 문자열의 시작
$ : 문자열의 끝
| : or 연산
*/
.replace(/^$/, 'a') // 5단계
.slice(0, 15).replace(/\.$/, ''); // 6단계
while (answer.length <= 2) answer += answer[answer.length - 1]; // 7단계
return answer
}
'알고리즘 문제 > 프로그래머스_Lv1 도장깨기' 카테고리의 다른 글
[프로그래머스] 숫자 문자열과 영단어 (Javascript) (0) | 2024.12.26 |
---|---|
[프로그래머스] 로또의 최고 순위와 최저 순위 (Javascript) (0) | 2024.12.25 |
[프로그래머스] 옹알이 (2) (Javascript) (1) | 2024.12.20 |
[프로그래머스] 약수의 개수와 덧셈 (Javascript) (0) | 2024.12.19 |
[프로그래머스] 음양 더하기 (Javascript) (0) | 2024.12.17 |