본문 바로가기

프로그래머스

[코딩테스트] 231002_핸드폰 번호 가리기, 없는 숫자 더하기, 가운데 글자 가져오기, 내적, 약수의 개수와 덧셈, 문자열 내림차순으로 배치하기

728x90

 

 

 


핸드폰 번호 가리기

function solution(phone_number) {
    var answer = '';
    for(let i=0 ; i < phone_number.length ; i++){
        if(i < phone_number.length - 4){
            answer += '*'
        }
        else{
            answer += phone_number[i].toString()
        }
    }
    return answer
}

 

 

 


없는 숫자 더하기

function solution(numbers) {
    let answer = 0
    for(let i=0 ; i <= 9 ; i++){
        const res = numbers.find((el)=> el == i)
        if(res == undefined){
            answer += i
        }
    }
    return answer
}

 

 

 


가운데 글자 가져오기

function solution(s) {
    var answer = '';
    if (s.length % 2 == 0){
        answer += s[s.length/2-1];
        answer += s[s.length/2];
    }
    else{
        answer += s[Math.round(s.length/2)-1]
    }
    return answer;
}

짝수일 경우에서는 좀 더 예쁘게 풀고 싶었는데,,,, 며칠 놀아서 그런가 머리가 안 돌아갔다.... ㅠㅠ Math.round() 기억해,,,, 반올림 메서드..... 

 

 

 


내적

function solution(a, b) {
    var answer = 0;
    let length = a.length;
    for(let i=0 ; i <length ; i++){
        answer += a[i]*b[i]
    }
    return answer;
}

알고리즘이 복잡스러워 보여서 으,,, 하다가 다시 마음을 가다듬고 보니까 쉬운 문제였다.... ㅎㅎ 겁 먹지마!! 할 수 있어!!!! 👊

 

 

 


약수의 개수와 덧셈

function solution(left, right) {
    var answer = 0;
    for(let i=left ; i <= right ; i++){
        let divisor = 0;
        let index = 1;
        while(index <= i){
            if(i % index == 0){
                divisor ++;
            }
            index ++;
        }
        if(divisor % 2 == 0){
            answer += i
        }
        else{
            answer -= i
        }
    }
    return answer;
}

left부터 right까지의 정수의 약수를 구하기 위해서 for문으로 left부터 right까지의 정수를 구하고, while문으로 그 수의 약수를 구했다. 약수의 개수를 변수 divisor에 담고, divisor의 개수가 짝수면 해당 정수(i) 값을 더하고, 홀수면 값을 빼 결괏값을 반환했다.

 

 


문자열 내림차순으로 배치하기

function solution(s) {
    return Array.from(s).sort((a, b) => a > b ? -1 : 1).join("")
}

생각보다 오래 풀었던 문제.... 우선 문제를 잘못 이해해서 문자열 s를 대소문자 구분해 역순으로 나열하는 문제인 줄 알고, 테스트 케이스도 하나 밖에 없어서 그렇게 풀었는데 실패가 우르르 떠버려서 질문하기를 확인하고 그제서야 문제를 제대로 이해해서 접근했다. 

먼저, 대소문자를 구분해서 내림차순으로 나열을 해야겠다고 생각했다. 정렬 역할을 하는 메서드를 찾다가 정수 형태의 값을 나열할 때 사용했던 sort() 메서드가 유니코드 순서에 따라 나열을 해준다는 사실을 알게 되었고, 유니코드를 확인해보니 대문자가 소문자보다 코드 번호가 앞에 있어 내림차순으로 배치하면 '소문자, 대문자'로 나열될 수 있음을 확인했다. (유니코드 상, A ~ Z => 65 ~ 90 | a ~ z => 97 ~ 122 ) 따라서, 대소문자를 구분할 필요 없이,  sort() 메서드를 사용하면 자동으로 '소문자(z~a)~대문자(Z~A)'로 나열이 가능해진다. 

sort() 메서드는 배열 메서드로, string인 매개변수를 배열로 변환해줄 필요가 있다. 때문에 Array.from() 메서드를 활용해서 string 객체를 array 객체로 변환해주었다.

문자열(string) 객체를 배열로 변환(Array.from)해주고, 문자열을 내림차순(sort)으로 정렬해주었다. 조건에 맞는 결과값을 반환하기 위해서 마지막으로, 배열인 객체를 다시 문자열로 변환하기 위해서 join()메서드를 사용해주었다.

본의 아니게 한 줄 코드로 완성이 되었다. 메서드는 언제나 짜릿하다.....

728x90