개발조각

[알고리즘 풀이_Lv0] 한 번만 등장한 문자, 잘라서 배열로 저장하기, 진료순서 정하기, 영어가 싫어요 본문

알고리즘🅰/제주코딩베이스캠프 프로그래머스 문제 풀이

[알고리즘 풀이_Lv0] 한 번만 등장한 문자, 잘라서 배열로 저장하기, 진료순서 정하기, 영어가 싫어요

개발조각 2023. 3. 15. 15:50
728x90
반응형

*제주코딩베이스캠프의 JavaScript 알고리즘 100일 챌린지를 참고로 정리하고 있습니다.*

 

한 번만 등장한 문자_24번째

문제


https://school.programmers.co.kr/learn/courses/30/lessons/120896

 

코딩테스트 연습 - 한 번만 등장한 문자

문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 retur

school.programmers.co.kr

문자열 s가 매개변수로 주어집니다. 

s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 

한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.

 

해결방안


문자열을 배열로 만드는 방법

s = "abcabcadc"

// 방법1_spread Operator
[...s] // ["a","b","c","a","b","c","a","d","c"]

// 방법2_split
s.split(''); // ["a","b","c","a","b","c","a","d","c"]

 

 

해당 문자가 문자열에서 1번 등장하는지 확인하는 방법

 

방법 1_split

 

// 등장하는 문자열이 1번인 문자를 넣어주면 배열길이가 2이다.
s.split('d') // s='abcabcadc', ["abcabca","c"]

// 문자열 마지막자리에 위치해도 배열길이가 2가 된다.
s.split('c') // s='abdc', ["abd",""]

 

// 해당 문자가 문자열에서 1번 등장하는지 확인
[...s].filter(c => s.split(c).length === 2) 

// 1번 등장한 문자를 정렬해주고 문자열로 만들기
return [...s].filter(c => s.split(c).length === 2).sort().join('');

 

방법2_정규식, match

// s = 'abcabcadc'
s.match(/a/g); // ["a","a","a"]
return s.match(/d/g); // ["d"]

그러나 변수는 정규식에 바로 넣을 수 없다.

그래서 new RegExp()를 사용해서 넣어줘야 된다.

return [...s].filter(c => s.match(new RegExp(c, 'g')).length === 1).sort().join('');

 

소스코드


// 방법1_split
function solution(s) {
    return [...s].filter(c => s.split(c).length === 2).sort().join('');
}
// 방법2_정규식, match
function solution(s) {    
    return [...s].filter(c => s.match(new RegExp(c, 'g')).length === 1).sort().join('');
}

잘라서 배열로 저장하기_25번째

문제


https://school.programmers.co.kr/learn/courses/30/lessons/120913

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문자열 my_str과 n이 매개변수로 주어질 때, 

my_str을 길이 n씩 잘라서 저장한 배열을 return하도록 solution 함수를 완성해주세요.

 

해결방안


 방법1_정규식

// s = 'abc1Addfggg4556b'
// . -> 모든 문자열 포함
// {} -> 문자열 길이 제한
my_str.match(new RegExp(`.{1,6}`, 'g')) // ["abc1Ad","dfggg4","556b"]
my_str.match(new RegExp(`.{5,6}`, 'g')) // ["abc1Ad","dfggg4"]

1부터 시작을 해야 안 잘리고 잘 나온다.

 

방법2_정규식 안 쓰기

// s = 'abcdef123'

function solution(my_str, n) {
    let result = []; // 잘린 배열 담기
    for(let i=0; i<my_str.length; i+=n){ // n만큼 건너뛰기
        result.push(my_str.slice(i, i+n)) // i~i+n까지 문자열 자르고 result에 넣어주기
    }
    return result
}

// my_str.slice(0, 0+3) -> 'abc'
// my_str.slice(3, 3+3) -> 'def'
// my_str.slice(6, 6+3) -> '123'

 

소스코드


// 방법1_정규식
function solution(my_str, n) {
    return my_str.match(new RegExp(`.{1,${n}}`, 'g'));
}
// 방법2_정규식 안 쓰기
function solution(my_str, n) {
    let result = [];
    for(let i=0; i<my_str.length; i+=n){
        result.push(my_str.slice(i, i+n))
    }
    return result
}

진료순서 정하기_26번째

문제


https://school.programmers.co.kr/learn/courses/30/lessons/120835

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 

정수 배열 emergency가 매개변수로 주어질 때 

응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

 

해결방안


내림차순 정렬

// emergency = [3, 76, 24]
let 응급순서 = emergency.sort((a,b)=> b-a) // [76,24,3]

 

// emergency = [3, 76, 24]
function solution(emergency) {
    let 응급순서 = emergency.sort((a,b)=> b-a) // [76,24,3]
    return emergency.map(v => 응급순서.indexOf(v)); // [0,1,2]
}

이렇게 쓰면 [3, 1, 2]이라고 나올 것 같지만 [0, 1, 2]가 나온다.

 

이유. emergency도 내림차순이 되어버렸기 때문에다.

emergency = [76, 24, 3]

응급순서 = [76, 24, 3]

→ [0, 1, 2]가 되어 버린다.

 

해결. slice를 사용하면 emergency를 변경시키지 않고 정렬된 값을 응급순서가 받을 수 있다.

function solution(emergency) {
    // emergency = [3, 76, 24]
    let 응급순서 = emergency.slice().sort((a,b)=> b-a) // [76,24,3]
    return emergency.map(v => 응급순서.indexOf(v)); // [2,0,1]
}

// emergency.slice() -> [3, 76, 24]

slice를 써야 깊은 복사가 돼서 emergency와 다른 정렬된 값을 '응급순서'변수가 받을 수 있다.

 

소스코드


function solution(emergency) {
    let 응급순서 = emergency.slice().sort((a,b)=> b-a);
    return emergency.map(v => 응급순서.indexOf(v) + 1);
}

영어가 싫어요_27번째

문제


https://school.programmers.co.kr/learn/courses/30/lessons/120894

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 

문자열 numbers가 매개변수로 주어질 때, 

numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.

 

해결방안


방법1_replaceAll

replaceAll을 사용하면 쉽게 해결할 수 있다.

// numbers = 'onefourzerosixseven'
return numbers.replaceAll('one', '1'); // "1fourzerosixseven"
parseInt(numbers
        .replaceAll('zero', '0')
        .replaceAll('one', '1')
        .replaceAll('two', '2')
        .replaceAll('three', '3')
        .replaceAll('four', '4')
        .replaceAll('five', '5')
        .replaceAll('six', '6')
        .replaceAll('seven', '7')
        .replaceAll('eight', '8')
        .replaceAll('nine', '9'));

 

방법2_정규식

오브젝트에 zeor ~ nine까지 담기

const obj = {
    zero: 0,
    one: 1,
    two: 2,
    three: 3,
    four: 4,
    five: 5,
    six: 6,
    seven: 7,
    eight: 8,
    nine: 9,
}
return numbers.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g, (v)=>{
    return obj[v]
})
// "123456789"

 

소스코드


// 방법1_replaceAll
function solution(numbers) {
    return parseInt(numbers
        .replaceAll('zero', '0')
        .replaceAll('one', '1')
        .replaceAll('two', '2')
        .replaceAll('three', '3')
        .replaceAll('four', '4')
        .replaceAll('five', '5')
        .replaceAll('six', '6')
        .replaceAll('seven', '7')
        .replaceAll('eight', '8')
        .replaceAll('nine', '9'));
}

 

// 방법2_정규식
function solution(numbers) {
    const obj = {
        zero: 0,
        one: 1,
        two: 2,
        three: 3,
        four: 4,
        five: 5,
        six: 6,
        seven: 7,
        eight: 8,
        nine: 9,
    }
    
    return +numbers.replace(/zero|one|two|three|four|five|six|seven|eight|nine/g, (v)=>{
        return obj[v]
    })
}
728x90
반응형
Comments