06. 프로그래머스(1단계) - 신규 아이디 추천

성훈·2021년 7월 30일
0

Algorithm

목록 보기
6/61
post-thumbnail

📌 문제의 조건

  1. new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
  2. newid에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(), 마침표(.)를 제외한 모든 문자를 제거합니다.
  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이 될 때까지 반복해서 끝에 붙입니다.

📌 풀이

첫 풀이 👨‍💻

function solution(new_id) {
	new_id = new_id.toLowerCase();
	new_id = new_id.match(/[a-z\d-_.]/g);
	for(let i = 0; i < new_id.length; i++){
			if(new_id[i] === '.' && new_id[i] === new_id[i+1]){
					new_id[i] = '';
			}
	}
	new_id = new_id.join('');

	if(new_id[0] === '.'){
		new_id = new_id.slice(1);
	}
	if(new_id[new_id.length-1] === '.'){
		new_id = new_id.slice(0, -1);
	}

	if(new_id === ''){
		new_id = 'a';
	}
	if(new_id.length > 15){
		new_id = new_id.slice(0, 15);
		
		if(new_id[new_id.length-1]==='.'){
			new_id = new_id.slice(0, 14);
		}
	}

	while(new_id.length < 3){
		new_id = new_id + new_id[new_id.length-1];
	}

  return new_id
}

더 생각한 후 풀이 👨‍💻

function solution(new_id){
	let id = new_id
	.toLowerCase()
	.replace(/[^\w-.]/g, '')
	.replace(/\.+/g, '.')
	.replace(/^\.|\.$/, '')
	.replace(/^$/, 'a')
	.slice(0, 15)
	.replace(/^\.|\.$/, '');
    
	return id.length > 3 ? id : id + id[id.length-1].repeat(3-id.length)
}

📌 리뷰

첫번째는 주어진 것을 순서에 따라 if문으로 바꾸어 나간 것이다.
정규 표현식을 쓸 수 있을 것 같은데 영 감이 안잡혀서 이렇게 하고 통과한 후 다른 분 코드를 봤더니 이렇게 멋지게 정규표현식을 쓰는 것이다.

String의 프로토 타입 메소드인 replace를 체이닝해서 사용하는걸 보고, 나도 이걸보면서 더듬더듬 집어나갔다.
5번째의 빈문자열을 정규표현식으로 표현을 못해서 한참 헤매다 다시 코드보니까 와우 놀라웠다.
시작점을 나타내는 ^와 끝을 나타내는 특수문자$ 사이에 아무것도 없으니 빈 문자열!

역시 고수들의 코드는 항상 놀라운 듯 하다.

📌 문제 출처

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

profile
어떻게 이걸 풀어낼 수 있을까

0개의 댓글