Level1 - 연습문제 - 문자열 내 마음대로 정렬하기

 

 문제

문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

제한 조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

입출력 예

 

strings n return
["sun", "bed", "car"] 1 ["car", "bed", "sun"]
["abce", "abcd", "cdx"] 2 ["abcd", "abce", "cdx"]

입출력 예 설명

입출력 예 1
"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.

입출력 예 2
"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.

 

 풀이

사용언어 : javascript

// 방법 1
function solution(strings, n) {
   
    strings.sort(function(a,b){
        if(a[n] > b[n]) return 1;
        if(b[n] > a[n]) return -1;

        if(a > b) return 1;
        if(b > a) return -1;

        return 0;
    });
    
    return strings;
}

// 방법 2
function solution(strings, n){
    strings.sort((a, b) => {
        
        if ( a[n] === b[n] ){
            return (a > b) - (a < b);
        }
        else {
            return (a[n] > b[n]) - (a[n] < b[n]);
        }
        
    });

    return strings;
}

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

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

+ Recent posts