Level1 - 연습문제 - 최대공약수와 최소공배수

 

 문제

문제 설명

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

제한 사항

  • 두 수는 1이상 1000000이하의 자연수입니다.

입출력 예

n m return
3 12 [3, 12]
2 5 [1, 10]

입출력 예 설명

입출력 예 #1
위의 설명과 같습니다.

입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.

 

 풀이

사용언어 :  javascript

function solution(n, m) {
    var answer = [];
    let min = Math.min(n,m);
    let max = Math.max(n,m);
    
    let gcd = function(min, max){
        return (min%max) === 0 ? max : gcd (max, min%max);
    };
    
    let lcm = function (min, max){
        return min * max / gcd(min, max);
    };
    
    
    answer[0] = gcd(min, max);
    answer[1] = lcm(min, max);
    
    return answer;
}

 

최대공약수 / 최소공배수를 보게되어 찾다보니 유클리드호제법이라는것에 도달하게 된다.

이를 이용해서 풀이에 접근하였다.

 

https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%95

 

 

출처 : https://programmers.co.kr/learn/courses/30/lessons/12940

Level1 - 연습문제 - 시저암호

 

 문제

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

 

제한 조건

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

입출력 예

s n result
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

 풀이

사용언어 :  javascript

function solution(s, n) {
    let up = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    let low = 'abcdefghijklmnopqrstuvwxyz';
    s = s.split('');
    if ( s > 8000 ) return;
    
    let answer = '';
    for ( let i = 0 ; i < s.length; ++i ){
        
        if ( s[i] == ' '){
            answer+= ' ';
            continue;
        }
        
        let data = up.includes(s[i]) ? up : low ;
        let num = data.indexOf(s[i]) + n;
        
        if ( num >= data.length){
            num -= data.length;
    }
    
    return answer;
}

출처 : https://programmers.co.kr/learn/courses/30/lessons/12926

Level1 - 2021 카카오 채용연계형 인턴십 - 숫자 문자열과 영단어

 

 문제

문제 설명

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

  • 1478 → "one4seveneight"
  • 234567 → "23four5six7"
  • 10203 → "1zerotwozero3"

이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.

참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.

숫자 영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine

제한사항

  • 1 ≤ s의 길이 ≤ 50
  • s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
  • return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.

입출력 예

s result
"one4seveneight" 1478
"23four5six7" 234567
"2three45sixseven" 234567
"123" 123

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • 문제 예시와 같습니다.

입출력 예 #3

  • "three"는 3, "six"는 6, "seven"은 7에 대응되기 때문에 정답은 입출력 예 #2와 같은 234567이 됩니다.
  • 입출력 예 #2와 #3과 같이 같은 정답을 가리키는 문자열이 여러 가지가 나올 수 있습니다.

입출력 예 #4

  • s에는 영단어로 바뀐 부분이 없습니다.

제한시간 안내

  • 정확성 테스트 : 10초

 

 

 

 풀이

사용언어 : javascript

function solution(s) {
    var answer = '';
    s = s.split('');
    
    let stringNum = '';
    for( let i = 0 ; i < s.length; ++ i ){
        
        if ( s[i].charCodeAt(0) >= 65 ){
            
            stringNum += s[i];
            if ( getNumber(stringNum) >= 0){
                answer += getNumber(stringNum);
                stringNum = '';    
            }
            
        }
        else {        
            answer += s[i];
        }
        
    }
    
    answer = parseInt(answer);
    
    return answer;
}


function getNumber(value){
    
  switch(value){
      case 'zero':
          return 0;
      case 'one':
          return 1;
      case 'two':
          return 2;
      case 'three':
          return 3;
      case 'four':
          return 4;
      case 'five':
          return 5;
      case 'six':
          return 6;
      case 'seven':
          return 7;
      case 'eight':
          return 8;
      case 'nine':
          return 9;
  } 
}

출처 : https://programmers.co.kr/learn/courses/30/lessons/81301

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

 

 문제

문제 설명

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ left  right ≤ 1,000

입출력 예

left right result
13 17 43
24 27 52

입출력 예 설명

입출력 예 #1

  • 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.

 

약수 약수의 개수
13 1, 13 2
14 1, 2, 7, 14 4
15 1, 3, 5, 15 4
16 1, 2, 4, 8, 16 5
17 1, 17 2
  • 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.
약수 약수의 개수
24 1, 2, 3, 4, 6, 8, 12, 24 8
25 1, 5, 25 3
26 1, 2, 13, 26 4
27 1, 3, 9, 27 4
  • 따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.

 

 풀이

사용언어 : 

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

출처 : https://programmers.co.kr/learn/courses/30/lessons/77884

Level 1 - 2018 KAKAO BLIND RECRUITMENT - 다트게임

 

 문제

문제 설명

다트 게임

카카오톡에 뜬 네 번째 별! 심심할 땐? 카카오톡 게임별~

카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.

  1. 다트 게임은 총 3번의 기회로 구성된다.
  2. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다.
  3. 점수와 함께 Single(S), Double(D), Triple(T) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으로 계산된다.
  4. 옵션으로 스타상(*) , 아차상(#)이 존재하며 스타상(*) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상(#) 당첨 시 해당 점수는 마이너스된다.
  5. 스타상(*)은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상(*)의 점수만 2배가 된다. (예제 4번 참고)
  6. 스타상(*)의 효과는 다른 스타상(*)의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상(*) 점수는 4배가 된다. (예제 4번 참고)
  7. 스타상(*)의 효과는 아차상(#)의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상(#)의 점수는 -2배가 된다. (예제 5번 참고)
  8. Single(S), Double(D), Triple(T)은 점수마다 하나씩 존재한다.
  9. 스타상(*), 아차상(#)은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.

입력 형식

"점수|보너스|[옵션]"으로 이루어진 문자열 3세트.
예) 1S2D*3T

  • 점수는 0에서 10 사이의 정수이다.
  • 보너스는 S, D, T 중 하나이다.
  • 옵선은 *이나 # 중 하나이며, 없을 수도 있다.

출력 형식

3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.
예) 37

입출력 예제

예제

dart Result answer 설명
1 1S2D*3T 37 11 * 2 + 22 * 2 + 33
2 1D2S#10S 9 12 + 21 * (-1) + 101
3 1D2S0T 3 12 + 21 + 03
4 1S*2T*3S 23 11 * 2 * 2 + 23 * 2 + 31
5 1D#2S*3S 5 12 * (-1) * 2 + 21 * 2 + 31
6 1T2D3D# -4 13 + 22 + 32 * (-1)
7 1D2S3T* 59 12 + 21 * 2 + 33 * 2

 

 

 

 풀이

사용언어 : javascript

function solution(dartResult) {

    var answer = 0;
    dartResult = dartResult.split('');
    
    for ( let i = 1; i < dartResult.length; ++i ){
        if ( dartResult[i] <= 9){
            if (dartResult[i-1] <= 9 ){
                dartResult[i-1] = dartResult[i-1] + dartResult[i];
                dartResult[i] = '';
            }
            else if (dartResult[i+1] <= 9 ){
                dartResult[i+1] = dartResult[i] + dartResult[i+1];
                dartResult[i] = '';
            }
        }
    }
    

    for (var i = 0; i < dartResult.length; i++) {
    if (dartResult[i] === '') {
        dartResult.splice(i, 1);
    }
    }
    
    
    let score = [];
    let idx = 1;
    for ( let i = 0 ; i < dartResult.length; ++i ){
        
        if ( dartResult[i] == '')
            continue;
            
            score.push(getScore( dartResult[i], dartResult[i+1]));

            if ( (i+2) < dartResult.length &&  dartResult[i+2] == '*'){
                score[score.length-1] = score[score.length-1] * 2;
                if ( score.length > 1 ){
                    score[score.length-2] = score[score.length-2] * 2;
                }
                ++i;
            }
            else if ( (i+2) < dartResult.length &&  dartResult[i+2] == '#'){
                score[score.length-1] = score[score.length-1] * -1;
                ++i;
            }
            
        ++i;

        
    }

    
    for ( let i = 0 ; i < score.length; ++i ){
        answer += score[i];
    }
    
    return answer;
}


function getScore(value, type){

    switch(type){
    case 'S':
    return Math.pow(parseInt(value),1);
    
    
    case 'D':
    return  Math.pow(parseInt(value),2);
     
    
    case 'T':
    return Math.pow(parseInt(value),3);
     
    }

}

 

출처 : https://programmers.co.kr/learn/courses/30/lessons/17682

Level 1 - 월간 코드 챌린지 시즌1 - 내적

 

 문제

 

문제 설명

길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.

이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이)


제한사항

  • a, b의 길이는 1 이상 1,000 이하입니다.
  • a, b의 모든 수는 -1,000 이상 1,000 이하입니다.

입출력 예

a b result
[1,2,3,4] [-3,-1,0,2] 3
[-1,0,1] [1,0,-1] -2

입출력 예 설명

입출력 예 #1

  • a와 b의 내적은 1*(-3) + 2*(-1) + 3*0 + 4*2 = 3 입니다.

입출력 예 #2

  • a와 b의 내적은 (-1)*1 + 0*0 + 1*(-1) = -2 입니다.

 

 풀이

사용언어 : javascript

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

출처 : https://programmers.co.kr/learn/courses/30/lessons/70128

Level 1 - 연습문제 - 소수 찾기

 

 문제

문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

제한 조건

  • n은 2이상 1000000이하의 자연수입니다.

입출력 예

n result
10 4
5 3

입출력 예 설명

입출력 예 #1
1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환

입출력 예 #2
1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환

 

 

 풀이

사용언어 : javascript

function solution(n) {
    var answer = 0;
    
    let arr = new Set();
    for ( let i = 1; i <= n; i += 2){
   
        arr.add(i);
    }
    
    
    for ( let i = 3; i < Math.sqrt(n); ++i){
        if ( arr.has(i)){
            for ( let j = i * i ; j <= n; j += i ){
                arr.delete(j);
            }
        }
    }
    
    return arr.size ;
}

 

 

 

출처: https://programmers.co.kr/learn/courses/30/lessons/12921

Level 1 - 해시 - 완주하지 못한 선수

 

 문제

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예

participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"

입출력 예 설명

예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 

 

 풀이

사용언어 : javascript 

function solution(participant, completion) {
    var answer = '';
    participant.sort();
    completion.sort();

    for ( let j = 0 ; j < participant.length; ++j ){
        if ( participant[j] !== completion[j] ){
            answer = participant[j];
            break;
        }     
    }
    
    return answer;
}

출처 : https://programmers.co.kr/learn/courses/30/lessons/42576

 

+ Recent posts