IT기초/프로그래머스 문제풀이
[프로그래머스 LV.1] #26 신규 아이디 추천 (JavaScript)
_Patrick
2023. 5. 25. 07:20
💡 문제
🔍 분석 및 계획
✅ 문제 이해
문자열을 입력했을 때 주어진 규칙에 따라 변형하는 문제
- 입력 값 : 문자열
- 1 <= 문자열길이 <= 1000
- 알파벳 대문자, 알파벳 솜누자, 숫자, 특수문자로 구성
- 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정 - 출력 값 : 규칙에 맞게 변형된 문자열
문자열 변형 규칙
- 모든 대문자를 소문자로 치환
- 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자 제거
- 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
- 마침표(.)가 처음이나 끝에 위치한다면 제거
- 빈 문자열이라면 "a" 대입
- 길이가 16자 이상이면, 첫 15개의 문자를 제외한 나머지 문자 모두 제거
제거 후 마침표(.)가 끝에 위치한다면 제거 - 길이가 2자 이하면 마지막 문자를 길이가 3이 될때까지 반복
위 문제는 입력되는 문자열의 길이가 제한되어 있기 때문에 가능한 O(n)이 걸리는 함수들을 활용해서 최대한 깔끔한 식을 목표로 함수를 사용하는 것이 좋을 것 같다
- toLowerCase
- /[^a-z0-9-_.]/
- /\.{2,}/g
- /^\.|\.$/g
- 길이 ===0
- 길이 >=16
- 길이 <=2
가능하면 평소에 거의 사용하지 않는 정규식을 이번기회에 사용해보려고 구글링을 열심히 했다
✅ 의사코드 작성
function solution(babbling) {
//각 단계 실행..
}
📝 코드 구현
최종 코드
function solution(new_id) {
let answer = new_id.toLowerCase();
answer = answer.replace(/[^a-z0-9-_.]/g, "");
answer = answer.replace(/\.{2,}/g, ".");
answer = answer.replace(/^\.|\.$/g, "");
answer = answer.length === 0 ? "a" : answer;
answer = answer.length >= 16 ? answer.slice(0, 15) : answer;
if (answer.at(-1) === ".") answer = answer.slice(0, -1);
if (answer.length <= 2) answer += answer.at(-1).repeat(3 - answer.length);
return answer;
}
시간 복잡도 : O(n)
💭 되돌아 보기
✅ 다른 사람 풀이
1.
각 단계의 결과값에 계속 다음 단계로 이어 붙여 연결하고 주석으로 어떤 단계인지 설명을 넣었다
function solution(new_id) {
const answer = new_id
.toLowerCase() // 1
.replace(/[^\w-_.]/g, '') // 2
.replace(/\.+/g, '.') // 3
.replace(/^\.|\.$/g, '') // 4
.replace(/^$/, 'a') // 5
.slice(0, 15).replace(/\.$/, ''); // 6
const len = answer.length;
return len > 2 ? answer : answer + answer.charAt(len - 1).repeat(3 - len);
}
내코드에서 개선점
- 2단계 : \w = [A-Za-z0-9_]
- 3단계 : /\.+/g = .한개이상
- 5단계 : /^$/ = 빈문자열
- 6단계 : replace(/\.$/, '') => 마지막열 . 제거에 정규식 사용
2.
정규식 만으로 작성한 코드 ㄷㄷ
const solution = new_id =>
new_id.toLowerCase()
.replace(/[^\w-_.]/g, "")
.replace(/\.+/g, ".")
.replace(/^\.|\.$/g, "")
.replace(/^$/, "a")
.match(/^.{0,14}[^.]/)[0]
.replace(/^(.)$/, "$1$1$1")
.replace(/^(.)(.)$/, "$1$2$2");