[JavaScript] 2021 KAKAO : 신규 아이디 추천

전인혁·2022년 6월 17일
1
post-thumbnail

문제분류

문자열

문제

https://programmers.co.kr/learn/courses/30/lessons/72410

신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.


제한사항
newid는 길이 1 이상 1,000 이하인 문자열입니다.
new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
new_id에 나타날 수 있는 특수문자는 -
.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.


예제 입력 1

...!@BaT#*..y.abcdefghijklm

예제 출력 1

bat.y.abcdefghi

예제 입력 2

z-+.^.

예제 출력 2

z--

예제 입력 3

=.=

예제 출력 3

aaa

예제 입력 4

123_.def

예제 출력 4

123_.def

예제 입력 5

abcdefghijklmn.p

예제 출력 4

abcdefghijklmn

Solution

  • 1단계 : 모든 대문자를 소문자로 치환
    for loop을 활용하여 newID를 구성하는 각 문자들에 toLowerCase()를 적용하여 모두 소문자로 치환한다.

  • 2단계 : 알파벳 소문자(a-z), 숫자(0-9), 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자 제거
    허용되는 문자들을 rule[]에 담는다. for loop와 Array.find()를 활용하여 newID의 문자들을 검증한다.
    그 뒤, 허용되는 문자들만 새로운 배열 newArr에 push하고, newArr을 합쳐서 String으로 return 한다.

  • 3단계 : 마침표가 2번이상 연속된 부분 하나의 마침표로 치환
    while문을 활용하여, newID에 ".." 문자열이 포함되는 동안 ".."을 "."으로 치환하는 행위를 반복한다.

  • 4단계 :마침표가 처음과 끝에 위치한다면 제거
    처음과 끝 문자를 검증하기 위해, 문자열(newID)을 배열(newArr)로 치환한다.
    만약 배열의 첫 번째 원소가 "." 이라면, 첫 번째 원소를 삭제한다. splice(0, 1) 원소가 하나 줄어들었으므로, maxIdx를 하나 줄여준다.
    만약 배열의 마지막 원소가 "." 이라면, 마지막 원소를 삭제한다. splice(maxIdx, 1)
    newArr을 합쳐서 String으로 return 한다.

  • 5단계 : 빈 문자열이면 new_id에 a대입
    빈 문자열이라면, 즉 newID의 길이가 0이라면 "a"를 리턴한다.
    아니라면 그대로 newID를 리턴한다.

  • 6단계 : new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약, 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
    끝 문자 검증 및 삭제를 위해, 문자열(newID)를 배열(newArr)로 치환한다.
    만약 newArr의 길이가 16이상이라면, Array.filter()를 활용하여, 15개의 원소만 새로운 배열로 반환하여 newArr에 담는다.
    길이를 조정한 배열의 마지막 원소가 "."이라면, 마지막 원소를 삭제한다. splice(maxIdx, 1)
    newArr을 합쳐서 String으로 return 한다.

  • 7단계 : new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
    먼저, 마지막 문자를 찾기위해 maxIdx를 선언한다. (newID의 길이 - 1)
    while문을 활용하여, newID의 길이가 2이하일 동안, 마지막 문자를 붙여간다. newId = newID + newID[maxIdx]
    길이가 3이상이 되면 while문을 벗어나고, newID를 리턴한다.

  • solution()
    입력 new_id를 각 단계에 해당하는 함수에 대입하고, 최종 결과를 정답 제출을 위한 변수 answer에 담는다.

코드

// 1단계 : 모든 대문자를 소문자로 치환
function Step1(newID) {
  let newString = "";
  for (let i = 0; i < newID.length; i++) {
    newString = newString + newID[i].toLowerCase();
  }
  return newString;
}

// 2단계 : 알파벳 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자 제거
function Step2(newID) {
  let newArr = [];
  let rule = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "_", "."];

  for (let i = 0; i < newID.length; i++) {
    if (rule.find((el) => el === newID[i])) {
      newArr.push(newID[i]);
    }
  }
  return newArr.join("");
}

// 3단계 : 마침표가 2번이상 연속된 부분 하나의 마침표로 치환.
function Step3(newID) {
  while (newID.includes("..")) {
    newID = newID.replace("..", ".");
  }
  return newID;
}

// 4단계 : 마침표가 처음과 끝에 위치한다면 제거
function Step4(newID) {
  let newArr = [];
  let maxIdx = newID.length - 1;
  for (let i = 0; i < newID.length; i++) {
    newArr.push(newID[i]);
  }

  if (newArr[0] === ".") {
    newArr.splice(0, 1);
    maxIdx = maxIdx - 1;
  }

  if (newArr[maxIdx] === ".") {
    newArr.splice(maxIdx, 1);
  }

  return newArr.join("");
}

// 5단계 : 빈문자열이면 new_id에 a대입
function Step5(newID) {
  if (newID.length === 0) return "a";
  else return newID;
}

// 6단계 : new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
function Step6(newID) {
  let newArr = [];
  let maxIdx = newID.length - 1;

  for (let i = 0; i < newID.length; i++) {
    newArr.push(newID[i]);
  }
  if (newArr.length >= 16) {
    newArr = newArr.filter((el, cnt) => cnt < 15);
    maxIdx = 14;
  }
  if (newArr[maxIdx] === ".") newArr.splice(maxIdx, 1);
  return newArr.join("");
}

// 7단계 : new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
function Step7(newID) {
  let maxIdx = newID.length - 1;

  while (newID.length <= 2) newID = newID + newID[maxIdx];

  return newID;
}

function solution(new_id) {
    var answer = '';
    
    new_id = Step1(new_id);
  	new_id = Step2(new_id);
  	new_id = Step3(new_id);
 	new_id = Step4(new_id);
	new_id = Step5(new_id);
 	new_id = Step6(new_id);
  	new_id = Step7(new_id);
    answer= new_id
  
    return answer;
}

느낀 점

프로그래머스에서 풀어본 첫 번째 문제이다.
알고리즘을 적용하기보다는 단순 구현 문제라고 느꼈다.


각 상황에 적합한 JS 메소드를 사용해야 했지만, 기억이 잘 나지않아서 코드를 비효율적으로 작성하게 되었다.

1. 2단계에서 특정 문자를 제외하고 모두 제거해야 할 때, rule 배열을 두고 Array.find()로 검증하는 것보다 더 효율적인 방법이 있을 것 같다고 생각했다.

2. 4단계와 6단계에서, String의 첫 번째 원소를 제거할 때, substring() 메소드를 사용하면 되지만, Array로 치환하여 Array 메소드를 사용한 점.


기본적인 함수와 메소드를 더 탄탄히 학습해야겠다고 느꼈다.

profile
Front-end Developer

0개의 댓글