코딩 공부/코딩테스트

자바스크립트 코딩테스트 입문 (9)

천서리 2023. 5. 24. 21:55
QUOTE THE DAY

“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 9 수학, 문자열, 해시, 완전탐색, 조건문

출처 : https://programmers.co.kr/

 

프로그래머스

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

programmers.co.kr


개미 군단

문제

개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.

 

 

제한사항

  • hp는 자연수입니다.
  • 0 ≤ hp ≤ 1000

 

입출력 예

 

hp result
23 5
24 6
999 201

입출력 예 설명

 

입출력 예 #1

  • hp가 23이므로, 장군개미 네마리와 병정개미 한마리로 사냥할 수 있습니다. 따라서 5를 return합니다.

입출력 예 #2

  • hp가 24이므로, 장군개미 네마리 병정개미 한마리 일개미 한마리로 사냥할 수 있습니다. 따라서 6을 return합니다.

입출력 예 #3

  • hp가 999이므로, 장군개미 199 마리 병정개미 한마리 일개미 한마리로 사냥할 수 있습니다. 따라서 201을 return합니다.

 

solution.js

function solution(hp) {
  var answer = 0;
  
  var generals = Math.floor(hp / 5);
  hp -= generals * 5;
  
  var soldiers = Math.floor(hp / 3);
  hp -= soldiers * 3;
  
  var workers = hp;
  
  answer = generals + soldiers + workers;
  
  return answer;
}
  1. 변수 초기화: answer 변수를 0으로 초기화합니다.
  2. 장군(generals) 계산: 주어진 체력(hp)을 5로 나눈 몫을 장군의 수로 설정합니다. 장군 한 명은 5의 체력을 소비합니다. 장군의 수를 계산한 후, 체력(hp)에서 장군의 수에 5를 곱한 값을 빼서 남은 체력을 갱신합니다.
  3. 군인(soldiers) 계산: 남은 체력(hp)을 3으로 나눈 몫을 군인의 수로 설정합니다. 군인 한 명은 3의 체력을 소비합니다. 군인의 수를 계산한 후, 체력(hp)에서 군인의 수에 3을 곱한 값을 빼서 남은 체력을 갱신합니다.
  4. 노동자(workers) 계산: 남은 체력(hp)는 노동자의 수로 설정합니다. 남은 체력은 노동자 한 명당 1의 체력을 소비합니다.
  5. answer 값 갱신: 장군, 군인, 노동자의 수를 합한 값을 answer 변수에 할당합니다.
  6. 최종 결과 반환: 계산된 answer 값을 반환합니다.

모스부호(1)

문제

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.

morse = { 
    '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
    '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
    '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
    '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
    '-.--':'y','--..':'z'
}

 

 

제한사항

  • 1 ≤ letter의 길이 ≤ 1,000
  • return값은 소문자입니다.
  • letter의 모스부호는 공백으로 나누어져 있습니다.
  • letter에 공백은 연속으로 두 개 이상 존재하지 않습니다.
  • 해독할 수 없는 편지는 주어지지 않습니다.
  • 편지의 시작과 끝에는 공백이 없습니다.

 

입출력 예

 

letter result
".... . .-.. .-.. ---" "hello"
".--. -.-- - .... --- -." "python"

입출력 예 설명

 

입출력 예 #1

  • .... = h
  • . = e
  • .-.. = l
  • .-.. = l
  • --- = o
  • 따라서 "hello"를 return 합니다.

입출력 예 #2

  • .--. = p
  • -.-- = y
  • - = t
  • .... = h
  • --- = o
  • -. = n
  • 따라서 "python"을 return 합니다.

 

  • a ~ z에 해당하는 모스부호가 순서대로 담긴 배열입니다.
  • {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."}

solution.js

function solution(letter) {
  var answer = '';
  
  var morse = {
    '.-': 'a', '-...': 'b', '-.-.': 'c', '-..': 'd', '.': 'e', '..-.': 'f',
    '--.': 'g', '....': 'h', '..': 'i', '.---': 'j', '-.-': 'k', '.-..': 'l',
    '--': 'm', '-.': 'n', '---': 'o', '.--.': 'p', '--.-': 'q', '.-.': 'r',
    '...': 's', '-': 't', '..-': 'u', '...-': 'v', '.--': 'w', '-..-': 'x',
    '-.--': 'y', '--..': 'z'
  };
  
  var codes = letter.split(' ');
  
  for (var i = 0; i < codes.length; i++) {
    var code = codes[i];
    answer += morse[code];
  }
  
  return answer;
}
  1. 변수 초기화: answer 변수를 빈 문자열('')로 초기화합니다. answer 변수는 해독된 문자열을 저장할 변수입니다.
  2. 모스 부호 매핑: morse 객체는 모스 부호를 영어 문자로 매핑한 객체입니다. 각 모스 부호에 해당하는 영어 문자가 키(key)로, 영어 문자가 값(value)으로 저장되어 있습니다.
  3. 모스 부호 분리: 주어진 문자열 letter은 공백을 기준으로 모스 부호가 분리된 형태입니다. split() 함수를 사용하여 letter 문자열을 공백을 기준으로 나눠서 codes 배열에 저장합니다.
  4. 모스 부호 해독: 반복문을 사용하여 codes 배열의 각 요소에 대해 해독을 수행합니다. 코드에서는 변수 i를 0부터 codes 배열의 길이보다 작을 때까지 증가시키며 반복합니다.
  5. 해독된 문자열 생성: codes 배열의 현재 요소를 code 변수에 할당합니다. morse 객체에서 code를 키로 사용하여 해당하는 영어 문자를 찾고, answer 변수에 이어붙입니다.
  6. 최종 결과 반환: 모든 모스 부호를 해독하여 이어붙인 answer 변수를 반환합니다.

가위 바위 보

문제

가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 0 < rsp의 길이 ≤ 100
  • rsp와 길이가 같은 문자열을 return 합니다.
  • rsp는 숫자 0, 2, 5로 이루어져 있습니다.

 

입출력 예

 

rsp result
"2" "0"
"205" "052"

 

입출력 예 설명

 

입출력 예 #1

  • "2"는 가위이므로 바위를 나타내는 "0"을 return 합니다.

입출력 예 #2

  • "205"는 순서대로 가위, 바위, 보이고 이를 모두 이기려면 바위, 보, 가위를 순서대로 내야하므로 “052”를 return합니다.

 

solution.js

function solution(rsp) {
    let arr = {
        2: 0,
        0: 5,
        5: 2
    };
    var answer = [...rsp].map(v => arr[v]).join("");
    return answer;
}
  1. 변환 매핑 객체 생성: arr 객체는 가위(2), 바위(0), 보(5)를 각각 다른 값으로 매핑한 객체입니다. 가위를 2로, 바위를 0으로, 보를 5로 매핑하였습니다.
  2. 변수 초기화: answer 변수를 빈 문자열("")로 초기화합니다. answer 변수는 변환된 결과를 저장할 변수입니다.
  3. 문자열 변환: 주어진 가위바위보 문자열 rsp를 배열로 변환하고, map 함수를 사용하여 각 문자에 대해 매핑 객체(arr)를 통해 변환합니다. 변환된 결과를 배열로 생성한 후, join 함수를 사용하여 문자열로 결합합니다.
  4. 최종 결과 반환: 변환된 문자열을 answer 변수에 할당한 후 반환합니다.

구슬을 나누는 경우의

문제

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ balls ≤ 30
  • 1 ≤ share ≤ 30
  • 구슬을 고르는 순서는 고려하지 않습니다.
  • share  balls

 

입출력 예

 

balls share result
3 2 3
5 3 10

입출력 예 설명

 

입출력 예 #1

  • 서로 다른 구슬 3개 중 2개를 고르는 경우의 수는 3입니다.

입출력 예 #2

  • 서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.

 

Hint

  • 서로 다른 n개 중 m개를 뽑는 경우의 수 공식은 다음과 같습니다.

 

solution.js

function solution(balls, share) {
  const dp = Array.from(Array(balls + 1), () => Array(share + 1).fill(0));

  for (let i = 1; i <= balls; i++) {
    dp[i][1] = i;
  }

  for (let i = 2; i <= balls; i++) {
    for (let j = 2; j <= share; j++) {
      dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
    }
  }

  return dp[balls][share];
}
  1. 2차원 배열 초기화: dp 배열은 (balls + 1) x (share + 1) 크기의 2차원 배열로 초기화됩니다. 배열의 모든 요소는 0으로 초기화됩니다. dp[i][j]는 i개의 볼을 j명의 인원에게 나누는 경우의 수를 나타냅니다.
  2. 첫 번째 열 초기화: dp 배열의 첫 번째 열(dp[i][1])은 i번째 행(볼의 개수)의 값으로 초기화됩니다. 이는 하나의 인원에게 모든 볼을 나누는 경우의 수입니다.
  3. 나머지 열 계산: 이중 반복문을 사용하여 dp 배열의 나머지 열(dp[i][j])을 계산합니다. i는 2부터 balls까지, j는 2부터 share까지 증가합니다. dp[i][j]는 이전 행(dp[i-1][j-1])의 값(한 명의 인원이 하나의 볼을 가지고 남은 볼을 나누는 경우의 수)과 이전 행(dp[i-1][j])의 값(인원이 볼을 받지 않고 남은 볼을 나누는 경우의 수)을 합한 것입니다.
  4. 결과 반환: dp[balls][share] 값을 반환합니다. 이는 볼을 balls 개수만큼 가지고 있는 경우, share 명의 인원에게 나누어주는 경우의 수를 나타냅니다.
반응형
Adventure Time - BMO