TIL 2 | 프로그래머스 문자열 문제

Lofo·2021년 1월 29일
0

Javascript

목록 보기
9/14

신규아이디 추천

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

function solution(new_id) {
    var answer = '';
    var allow_char = 'qwertyuiopasdfghjklzxcvbnm1234567890-_.';
    // 1단계 대문자를 소문자로 성공
    new_id=new_id.toLowerCase();

    //2단계 다른 문자 제거 성공
    var i = 0;
    var ok = -1;
    while (i < new_id.length) {
        ok = allow_char.indexOf(new_id[i]); // 못찾으면 -1, 찾으면 양수(0 포함)
        if (ok < 0) {
            new_id = new_id.replace(new_id[i], "");
            i = i - 1;
        }
        i++;
    }

    //3단계 .가 2번 이상 연속된 부분을 하나의 마침표로 치환
    var pattern = /[.]{2,}/g;
    new_id = new_id.replace(pattern, '.');

    //4단계 처음과 끝에 있는 .를 제거한다.
    if(new_id[0]==='.')  new_id = new_id.slice(1);
    if(new_id[new_id.length-1]==='.')  new_id = new_id.slice(0, 15);

    //5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
    if(new_id.length===0) new_id="a";

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

    //7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
    if(new_id.length === 1) new_id = new_id.concat(new_id[new_id.length-1]);
    if(new_id.length === 2) new_id = new_id.concat(new_id[new_id.length-1]);

    answer = new_id;
    return answer;
}

문제를 푸는 과정에서 알게 된 내용

대소문자 변경 함수

javascript에서 대문자를 소문자로 변경하는 함수는 toLowerCase()이다. 그리고 소문자를 대문자로 변경하는 함수는 toUpperCase()이다. 반드시 대입해주어야 한다. 이것 때문에 10분을 날려먹었다.

대문자로 변환

 var a = "ABC abc" ;
 a = a.toUpperCase() ;
// expected output: ABC ABC

소문자로 변환

 var a = "ABC abc" ;
 a = a.toLowerCase() ;
// expected output: abc abc

break;

문제를 푸는 과정에서 while문을 중간에 탈출할 수 있는 것이 필요했다. 이때, 사용되는 것이 break;이다. 나중에 로직을 바꾸느라 사용하지는 않았다.

let i = 0;

while (i < 6) {
 if (i === 3) {
   break; // i === 3이면 while문을 중단하고 다음 코드로 넘어간다.
 }
 i = i + 1;
}

console.log(i);
// expected output: 3

indexOf();

문자열 내에서 특정 문자(문자열 가능)를 찾고 싶을 때 사용하는 함수이다. 찾고 싶은 문자가 문자열 내에 있다면 그 문자가 시작하는 index값을 리턴해준다. 없다면 -1을 리턴한다. 단어가 중복되더라도 가장 먼저 나오는 것에 대한 index값을 리턴하고 함수는 종료된다.

const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?';

const searchTerm = 'dog';
const indexOfFirst = paragraph.indexOf(searchTerm); //dog가 두개 있지만 먼저 나오는 것의 index 40이 리턴된다.

console.log(`The index of the first "${searchTerm}" from the beginning is ${indexOfFirst}`);
// expected output: "The index of the first "dog" from the beginning is 40"

replace();

문자를 제거하거나 대체할 때 사용되는 함수이다. 활용성은 다양하다. 인자로 단순 문자열을 넣거나 정규표현식을 사용할 수도 있다. 첫번째 인자는 제거하거나 대체할 대상를 넣는다. 두번째 인자에는 제거하려면 '', 대체하려면 대체할 문자를 넣는다.

const remove = 'The quick brown fox jumps over the lazy dog.';

console.log(remove.replace('dog', '')); //제거하기 위해 ''(공백)을 넣음
// expected output: "The quick brown fox jumps over the lazy ."


const p = 'The quick brown fox jumps over the lazy dog.';

console.log(p.replace('dog', 'monkey')); //대체할 문자를 넣음
// expected output: "The quick brown fox jumps over the lazy monkey."

const regex = /Dog/i; //정규표현식을 사용한 것으로 대소문자 구분 없이 dog라는 문자열이라는 뜻이다.
console.log(p.replace(regex, 'ferret'));
// expected output: "The quick brown fox jumps over the lazy ferret."

sclie();

문자열의 일부분을 잘라서 새로운 문자열을 만드는 함수이다. 두 개의 인자를 받지만, 하나의 인자만 넣어도 된다. 첫번째 인자는 자르기 시작할 index를 넣는다. 그리고 두번째 인자 전까지 문자열을 자른다. 두번째 인자가 없을 경우 문자열 끝까지 자른다. 인자를 음수로 넣는다면 뒤에서부터 접근한다.

const str = 'The quick brown fox jumps over the lazy dog.';

console.log(str.slice(31));
// expected output: "the lazy dog."

console.log(str.slice(4, 19));
// expected output: "quick brown fox"

console.log(str.slice(-4));
// expected output: "dog."

console.log(str.slice(-9, -5));
// expected output: "lazy"

정규표현식

블로그를 정리하려고 다시 개념을 보고 있는 중인데.. 이 녀석 이산수학때 본 놈이네요..
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/%EC%A0%95%EA%B7%9C%EC%8B%9D
내용이 길어서 이 녀석은 MDN에서 따로 보는 게 좋을 것 같다.
문제를 풀면서 사용한 정규표현식을 정리하면 다음과 같다.

	var pattern = /[.]{2,}/g;
   new_id = new_id.replace(pattern, '.');

정규표현식은 표현하고자 하는 내용을 /과 / 사이에 넣어 생성한다. 위 코드를 해석하면 '.'이 2번 이상 반복되는 모든 경우이다. 그래서 new_id에 있는 모든 '.'이 2번 이상 반복된 문자열을 전부 1번만 나오도록 치환하는 코드이다.

profile
Love God, Love People, Love Code.

0개의 댓글