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

[알고리즘 풀이_Lv0] A로 B 만들기, 팩토리얼, k의 개수, 가까운 수

개발조각 2023. 3. 14. 14:24
728x90
반응형

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

 

A로 B 만들기_20번째

문제


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

 

프로그래머스

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

programmers.co.kr

문자열 before와 after가 매개변수로 주어질 때, 

before의 순서를 바꾸어 after를 만들 수 있으면 1을, 

만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.

 

소스 코드


function solution(before, after) {
    return before.split('').sort().join('') === after.split('').sort().join('') ? 1 : 0 ;
}

1. before

  1. 문자열을 배열로 만들어준다.
  2. 배열을 정렬한다.
  3. 정렬한 배열을 다시 문자열로 바꾼다.

2. after도 before와 똑같이 진행한다.

3. 정렬한 문자열 before, after이 같으면 1 아니면 0을 반환한다.

 

 


팩토리얼_21번째

문제


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

 

프로그래머스

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

programmers.co.kr

i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 

정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.

해결방안


function solution(n) {
    let i = 1;
    let factorial = 1;
    while(factorial <= n){
        i+= 1
        factorial *= i
    }
    return i;
}

위와 같이 쓰면 +1한값이 나온다.

이유. f === n일 경우에 한번 더 while문이 실행되기 때문이다.

n = 120;
i    f     f<=120
1    1     f<=120
2    2     f<=120
3    6     f<=120
4    24    f<=120
5    120   f<=120

그래서 아래와 같이 return i-1을 해주어야 된다.

function solution(n) {
    let i = 1;
    let factorial = 1;
    while(factorial <= n){
        i+= 1
        factorial *= i
    }
    return i-1;
}

 

소스 코드


function solution(n) {
    let i = 1;
    let factorial = 1;
    while(factorial <= n){
        i+= 1
        factorial *= i
    }
    return i-1;
}

k의 개수_22번째

문제


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

 

프로그래머스

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

programmers.co.kr

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. (

1, 10에서 1개, 11에서 2개, 12에서 1개, 13에서 1개 총 6번)

정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.

 

구글 입사문제와 유사하다.

https://codingdojang.com/scode/393

 

코딩도장

프로그래밍 문제풀이를 통해서 코딩 실력을 수련

codingdojang.com

1부터 10,000까지 8이라는 숫자가 총 몇번 나오는가?
8이 포함되어 있는 숫자의 갯수를 카운팅 하는 것이 아니라 8이라는 숫자를 모두 카운팅 해야 한다.(※ 예를들어 8808은 3, 8888은 4로 카운팅 해야 함)

 

해결방안


// 방법1
function solution(i, j, k) {
    let s = '';
    for(i; i<=j; i++){
        s+=i
    }
    
    return s; // 12345678910111213
    return s.split(k); // ["","23456789","0","","","2","3"]
    return s.split(k).length; // 7
    return s.split(k).length - 1; // 6
}

 

Array, fill

Array(j) // [empty x 13]
Array(j-i) // [empty x 12]
Array(j-i+1) // [empty x 13] -> Array개수에 맞춰서 생성됨

// 1부터 시작해서 13에서 끝내야 됨 [1, ..., 13]
Array(j-i+1).fill(i) // [1, ..., 1]
Array(j-i+1).fill(i).map((v, idx)=>v+idx) // [1, ..., 13]
Array(j-i+1).fill(i).map((v, idx)=>v+idx).join(''); // "12345678910111213"
Array(j-i+1).fill(i).map((v, idx)=>v+idx).join('').split(k).length - 1; // 6

 

 

소스 코드


// 방법1
function solution(i, j, k) {
    let s = '';
    for(i; i<=j; i++){
        s+=i
    }
    
    return s.split(k).length - 1;
}

 

// 방법 2
function solution(i, j, k) {
    return Array(j-i+1).fill(i).map((v, i)=>v+i).join('').split(k).length - 1;
}

가까운 수_23번째

문제


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

 

프로그래머스

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

programmers.co.kr

정수 배열 array와 정수 n이 매개변수로 주어질 때, 

array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

 

해결방안


전역 속성 Infinity은 무한대를 나타내는 숫자 값입니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity

 

Infinity - JavaScript | MDN

The global property Infinity is a numeric value representing infinity.

developer.mozilla.org

function solution(array, n) {
    let min = Infinity; // 무한대의 수
    let result = 0;
    
    for(let i of array) {
    	// 두수의 차(n-i)가 min보다 작으면
        if(Math.abs(n-i) < min){ // Math.abs: 절대값
            min = Math.abs(n-i) // n-i를 min에 대입
            result = i;
        }
    }
    return result;
}

이렇게만 쓰면 테스트 5번이 실패가 뜸

이유. "가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다."라는 조건이 있어서

function solution(array, n) {
    let min = Infinity;
    let result = 0;
    
    for(let i of array.sort()) {
        if(Math.abs(n-i) < min){
            min = Math.abs(n-i)
            result = i;
        }
    }
    return result;
}

그래서 미리 정렬을 해줘야 된다.

 

소스 코드


function solution(array, n) {
    let min = Infinity;
    let result = 0;
    
    for(let i of array.sort()) {
        if(Math.abs(n-i) < min){
            min = Math.abs(n-i)
            result = i;
        }
    }
    return result;
}
728x90
반응형