코딩테스트 문제풀이/programmers

프로그래머스 node.js - 신규 아이디 추천

sangchu 2024. 6. 7. 01:38

문제 링크

링크

 

풀이 과정

제시된 각 단계의 조건에 맞게 처리해주면 된다.

문제는 금방 파악했지만, 각 조건 처리해주는 데에서 애먹었다..

 

2단계는 정규식 쓰면 될 것 같지만 이에 대해 잘 모르고 타임어택(시간 재고 푸는 것) 중이라 그냥 아스키코드를 이용해서 풀어봤다.

 

뭔가 대체적으로 정규식을 이용해서 풀면 금방 풀릴 것 같다는 생각이 들었는데 정규식을 잘 몰라서 일단 주먹구구식 구현해봤다.

다른사람 풀이를 보면 대부분이 정규식을 이용해 깔끔하게 푼 것 같다. 이번 기회에 공부해둬야겠다!

 

 

전체 코드

function solution(new_id) {
  var answer = "";
  let tmpId = "";

  // 1단계 : 대문자 -> 소문자 치환
  new_id = new_id.toLowerCase().split("");

  // 2단계 : 알파벳 소문자, 숫자, 빼기, 밑줄, 마침표 제외 모든 문자 제거
  new_id.forEach((x) => {
    let asciiNum = x.charCodeAt();
    if (
      (asciiNum >= 97 && asciiNum <= 122) ||
      (asciiNum >= 48 && asciiNum <= 57) ||
      asciiNum === 95 ||
      asciiNum === 45 ||
      asciiNum === 46
    )
      tmpId += x;
  });

  // 3단계 : 마침표 2번 이상 연속이면 하나로 치환
  for (let i = 0; i < tmpId.length; i++) {
    if (!(tmpId[i] === "." && tmpId[i] === tmpId[i + 1])) answer += tmpId[i];
  }

  // 4단계 : 마침표 처음 or 마지막이면 제거
  if (answer[0] === ".") answer = answer.slice(1);
  if (answer[answer.length - 1] === ".") answer = answer.slice(0, -1);

  // 5단계 : id가 빈문자열이면 a 대입
  if (answer.length === 0) answer += "a";

  // 6단계 : id가 16자 이상이면 15자 이후 문자들 제거.
  if (answer.length > 15) answer = answer.substr(0, 15);
  if (answer[answer.length - 1] === ".") answer = answer.slice(0, -1); // 마지막 문자 마침표인 경우 제거

  // 7단계 : id가 2자 이하라면, 마지막 문자로 길이 3 될떄까지 반복 붙임
  if (answer.length <= 2) {
    let lastChar = answer[answer.length - 1];
    while (answer.length < 3) answer += lastChar;
  }

  return answer;
}

console.log(solution("...!@BaT#*..y.abcdefghijklm"));

 

 

다른 사람 코드(정규식 이용)

const solution = (new_id) => {
    const id = new_id
        .toLowerCase()
        .replace(/[^\w\d-_.]/g, '')
        .replace(/\.{2,}/g, '.')
        .replace(/^\.|\.$/g, '')
        .padEnd(1, 'a')
        .slice(0, 15)
        .replace(/^\.|\.$/g, '')        
    return id.padEnd(3, id[id.length-1])
}

역시 정규식을 쓰니까 깔끔.. 근데 정규식은 다른사람이 보면 뭔지 모를 것 같아서 만약 쓴다면 주석을 달면 좋을 것 같다.

padEnd 메서드는 처음봐서 찾아봤다. 

 

str.padEnd(targetLength [, padString])
  • 현재 문자열에 다른 문자열을 채워, 주어진 길이를 만족하는 새로운 문자열을 반환 
  • 첫번째 인자는 목표 문자열 길이, 두번째 인자는 현재 문자열에 채워넣을 다른 문자열
  • 현재 문자열의 길이보다 작다면 채워넣지 않고 그대로 반환.

 

위 문제에서는 첫번째 인자인 목표 문자열 길이 3이 아닐 시, id의 마지막 값으로 채우고 반환하기 위함인 것 같다.

 

 

 

 

풀이 시간 : 64분(문제 파악 5분)