프로그래머스 Lv.1 코테기출문제 정리 #1 14문제

세나정·2023년 5월 2일
0
post-thumbnail

기출문제 중에서도 쉬운 풀이는 해석 없이 넘어 가고 코드만 남기겠습니다.

[월간 코드 챌린지 시즌3] 나머지가 1이 되는 수 찾기

function solution(n) {
    for (i=1; i<n; i++) {
        if (n % i === 1) {
            return i
        }
    }
}

항상 배열만을 고집해서 배열의 min값을 찾으려다가 어차피 i가 오름차순으로 증가하니 제일 먼저 나온 i를 반환


[월간 코드 챌린지 시즌2] 음양 더하기

function solution(absolutes, signs) {
    for (i=0; i<absolutes.length; i++) {
        signs[i] ? absolutes[i] = absolutes[i] : absolutes[i] = -absolutes[i]
    }
    return absolutes.reduce( (a,c) => a+=c, 0)
}

더 짧은 코드

배열의 값을 바꿔주고 reduce를 하는 게 아니라
let ans = 0; 를 만든 후에 거기에다가 각 값을 더하거나 빼주면 됨
signs[i] ? answer += absolutes[i] : answer -= absolutes[i]

가장 간단한 방법으로는 reduce에는 index 인자로 들어가므로 곧바로 return
return absolutes.reduce((acc, val, i) => acc + (val * (signs[i] ? 1 : -1)), 0);

[월간 코드 챌린지 시즌3] 없는 숫자 더하기

// 단순하게 그냥 10까지 반복하면서 
// 자연수 중 갖고 있지 않은 수들을 더 해주면 됨
function solution(numbers) {
    let ans = 0;

    for (i=0; i<10; i++) {
        if (!numbers.includes(i)) {
            ans+=i
        }
    }
    return ans
}

더 짧은 코드

// 생각해보면.. 정말 1부터 9까지의 합에서 주어진 배열의 reduce 값을 빼줬으면 됐음
function solution(numbers) {
    return 45 - numbers.reduce((cur, acc) => cur + acc, 0);
}

[월간 코드 챌린지 시즌1] 내적

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

더 짧은 코드

// 사용하지 않을 cur는 _로 두고 i를 활용
function solution(a, b) {
    return a.reduce((acc, _, i) => acc += a[i] * b[i], 0);
}

[월간 코드 챌린지 시즌2] 약수의 개수와 덧셈

function solution(left, right) {
    let ans = [];
    let div = 1
    
    for (i=left; i<=right; i++) {
        for (j=1; j<=i; j++) {
            if (i%j === 0) {
                div *= -1
            }
        }
        ans.push(div*i)
        // div를 다시 1로 만들어줘서 카운팅 가능하게
        div = 1
    }
    return ans.reduce ( (a,c) => a+=c)
}

더 빠르고 신기한 해답

팁!

'제곱근이 정수면 약수의 갯수가 홀수다..'

function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++) {
    	// 제곱근이 홀수이면 약수의 갯수가 홀수 즉, 음수
        if (Number.isInteger(Math.sqrt(i))) {
            answer -= i;
        } else {
            answer += i;
        }
    }
    return answer;
}

[위클리 챌린지] 부족한 금액 계산하기

function solution(price, money, count) {
    let all_price = 0;
    
    for (i=1; i<=count; i++) {
        all_price += i*price
    }
    
    return all_price > money ? all_price - money : 0
}

[월간 코드 챌린지 시즌1] 3진법 뒤집기

아무런 검색도, 도움도 없이 여태 배운 지식으로 푼 문제.. 좀 뿌듯하군

function solution(n) {
    return parseInt( ([...n.toString(3)].reverse().join('')), 3 )
}

[Summer/Winter Coding(~2018)] 예산

처음엔 cnt라는 정수를 활용해서 +를 해주다가 길이가 더 정확할 것 같아서
>= 까지 포함하여 넣고 길이를 반환

function solution(d, budget) {
    d = d.sort((a,b) => a-b)
    let ans = [];
    for (i=0; i<d.length; i++) {
        budget -= d[i]
        if (budget >= 0) ans.push(budget)
    }
    return ans.length
}

신박한 풀이

function solution(d, budget) {
    d.sort((a, b) => a - b);
    while (d.reduce((a, b) => (a + b), 0) > budget) d.pop();
    return d.length;
}

반대로 접근해서, while문을 통해 큰 값을 빼다가 budget보다 
작거나 같아지는 순간 남아있던 d의 길이를 반환

[2018 KAKAO BLIND RECRUITMENT] [1차] 비밀지도 ★

function solution(n, arr1, arr2) {
    // 이진수로 바꿨을 때
    // 한 개 라도 1이라면 그것은 곧 #
    // 둘 다 없어야만 (0) 이여야만 길
    // 그때 0은 공백
    // #은 #대로 해서 출력 
    
    let ans = []; 
    
    for (i=0; i<arr1.length; i++) {
        ans.push(String(Number(arr1[i].toString(2))+Number(arr2[i].toString(2))))
    }
    
    for (i=0; i<ans.length; i++) {
            while (ans[i].length !== n) ans[i] = 0 + ans[i]   
                
    }
    
    for (i=0; i<ans.length; i++) {
        ans[i] = ans[i].replace(/[1-2]/g, "#")
        ans[i] = ans[i].replace(/0/g, " ")
    }
    
    return ans
}

조금 난잡하지만 그래도 풀었다는데 의의를 두고 싶다..
각 행을 이진수로 바꿔 두 개를 더해주고 string형으로 바꿔 ans에 push 하였다.
여기서 string으로 바꿔준 이유는 숫자끼리 더해서 각 자리가 둘 중 하나라도 0인 건 0 으로 내비두고 for문을 써주기 위해서이다.

원래는 함수를 만들어도 되지만 TC의 사이즈가 작으므로 반복문을 통해 앞에 0을 넣어준 후

각 자리를 바꾸는데 처음엔 replaceAll을 썼지만 replace를 통해 정규표현식을 사용하여 바꿔주었다 여기서 map을 활용해도 됨

신박한 풀이

function solution(n, arr1, arr2) {
    return arr1.map((v, i) => addZero(n, (v | arr2[i]).toString(2)).replace(/1|0/g, a => +a ? '#' : ' '));
}

const addZero = (n, s) => {
    return '0'.repeat(n - s.length) + s;
}

다들 코드를 보니 되게 짧게 푸셨는데 이 코드가 가장 직관적이고 좋았다.
addZero라는 함수를 만들어서 arr1은 map을통해 이진수로 바꾼 v에 나머지는 arr2[i]에 0을 더해준 후, 0이 이라면 #으로 0이 아니라면 공백으로 바꾸었다.


[2021 카카오 채용연계형 인턴십] 숫자 문자열과 영단어 ★

전에 풀었던 문제로 영어숫자문자들을 배열에 넣어준 후
그 배열을 순회하며 주어진 문자열에서 해당하는 값을 숫자로 바꾸면 된다.

function solution(s) {
    let numbers = ['zero','one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    
	// 숫자의 반복을 통해 각 자리가 문자열 s에 존재한다면 인덱스로 바꿔줌    
    numbers.forEach( (v, i) => {
        s = s.replaceAll(v, i)
    })
    
    return Number(s)
}

[월간 코드 챌린지 시즌1] 두 개 뽑아서 더하기

정말 놀랍게도 풀고 제출을 했는데 다른 사람 풀이 1등이 내가 푼 코드랑 똑같은 코드였다.. 나 꽤나 성장한 걸지도..

function solution(numbers) {
    let ans = [];
    
    for (i=0; i<numbers.length; i++) {
        for (j=i+1; j<numbers.length; j++) {
        ans.push(numbers[i]+numbers[j])
        }    
    }
    
    ans.sort((a,b) => a-b)
    
    return [...new Set(ans)]
}

[Summer/Winter Coding(~2018)] 소수 만들기 ☆

설마 삼중 포문을 쓰겠어? 했는데 진짜로 3중 포문을 쓰는 함수

여기서의 꿀팁은 주어진 수가 소수인지 판별할 때 그 수의 처음부터 끝까지를 나눠보는 것이 아닌 (isPrime) 당연히 제곱근이 나눠지면 그 친구도 나눠지는 것이므로 이렇게 해서 시간 복잡도를 줄일 수 있다.

function solution(nums){
    let answers = 0;
    for(let i = 0; i< nums.length-2; i++){
        for(let j = i+1; j < nums.length-1; j++){
            for(let k = j+1; k < nums.length; k++){
                 let sums = nums[i]+nums[j]+nums[k];
                if(isPrime(sums))
                    answers += 1;
                }
            }
        }
    return answers;
    }
function isPrime(num){
        for(let j = 2; j <= Math.sqrt(num); j++){
            if(num % j === 0)
                return false;
        }
        return true;
}

[2019 KAKAO BLIND RECRUITMENT] 실패율 ★★★

진짜 거의 한 두 시간동안 어찌저찌 풀긴 했다.. 근데 당연히도 TC가 20만까지 나오니 런타임에러가 나올 줄 알았다.

function solution(N, stages) {
    
    let 숫자갯수 = 0;
    let ans = new Map();
    
    for (i=1; i<=N; i++) {
        for (j=0; j<stages.length; j++) {
            if(stages[j] === i) {
                숫자갯수+=1
                ans[[i]] = 숫자갯수
                
            } else if (stages[j] > i) {
                ans[[i]] = 숫자갯수
            }
        }
        숫자갯수 = 0
    }
    
    let res = Object.values(ans)
    
    for (i=1; i<=N; i++) {
        ans[[i]] = (Object.values(ans)[i-1]/stages.length) 
        stages.length -= res[i-1]
    }
    
    let 객체를배열 = Object.entries(ans)
    정답 = 객체를배열.sort( (a,b) => b[1] - a[1])
    
    let 진짜정답 = [];
    
    for (i=0; i<정답.length; i++) {
        진짜정답.push(Number(정답[i][0]))
    }
    
    return 진짜정답
    
}

진짜 정답

function solution(N, stages) {
    let result = [];
    
    for(let i=1; i<=N; i++){
    	// 자신보다 큰 애의 길이를 분모
        let 분모 = stages.filter((x) => x >= i).length;
        
        // 자신에 해당하는 애를 분자
        let 분자 = stages.filter((x) => x === i).length;
        
        // 값을 넣어주고
        result.push([i, 분자/분모]);
    }
    
    // 소팅 후
    result.sort((a,b) => b[1] - a[1]);
    
    // map을 통해 결과값 반환
    return result.map((x) => x[0]);
}

[2018 KAKAO BLIND RECRUITMENT] [1차] 다트 던지기 ★

function solution(dartResult) {
    var score = 0;
    var answer = [];
    var index = 0; // 숫자 담을 변수
    
    for(let i=0; i<dartResult.length; i++) {

        if(dartResult[i] >= 0 && dartResult[i] <= 9 ) { //숫자일 경우
            
            if( dartResult[i] == 1 && dartResult[i+1] == 0 ) {
                // 10일 경우 10으로 만들어주고 0을 건너뛰기 위해 (한 칸 건너뛰기) i++ 해줌.
                index = 10;
                i++;
            } else { // 10이 아니라면 그 값을 그대로 활용
                index = dartResult[i];
            }
        
            
        // ★ "숫자가 아닐 경우엔 index값은 dartResult[i]로 숫자" ★
        } else if(dartResult[i] === "S") { // 1제곱
            answer.push(index);
            
        } else if (dartResult[i] === "D") { // 2제곱
            answer.push(Math.pow(index,2));
            
        } else if (dartResult[i] === "T") { // 3제곱
            answer.push(Math.pow(index,3));
            
            
        } else if (dartResult[i] === "#") { 
            // 아차상이 나올시 방금 쏜 점수는 음수가 됨
            answer[answer.length-1] *= -1; 
            
        } else if (dartResult[i] === "*") {
            // 스타상이 나올 땐 방금 쏜 점수과 아까 쏜 점수 두 개가 모두 두 배가 됨
            answer[answer.length-1] *= 2;
            answer[answer.length-2] *= 2;
        }
    }
    
    // '-1': NaN 는 스타상에서 앞전 인덱스가 없을 때 발견됨, 대신 계산에는 영향 X
    return answer.reduce( (a,c) => a+=Number(c))
}

굉장히 어렵지만 if문을 잘 짠다면 해결할 수 있는 문제
여기에서 신기했던 건 if문을 숫자와 문자로 둬서 숫자가 나올 때만 그값을 인덱스로 활용함 (잘 끊어침)

profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글