코딩 공부/JAVASCRIPT

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

천서리 2023. 6. 8. 18:14
QUOTE THE DAY

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

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 24 수학, 시뮬레이션, 문자열, 조건문, 반복문

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

 

프로그래머스

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

programmers.co.kr


치킨쿠폰

문제

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • chicken은 정수입니다.
  • 0 ≤ chicken ≤ 1,000,000

 

입출력 예

chicken result
100 11
1,081 120

 

입출력 예 설명

 

입출력 예 #1

  • 100마리를 주문하면 쿠폰이 100장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다.
  • 10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
  • 따라서 10 + 1 = 11 을 return합니다.

입출력 예 #2

  • 1081마리를 주문하면 쿠폰이 1081장 발급되므로 서비스 치킨 108마리를 주문할 수 있습니다. 그리고 쿠폰이 1장 남습니다.
  • 108마리를 주문하면 쿠폰이 108장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다. 그리고 쿠폰이 8장 남습니다.
  • 10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
  • 1마리를 주문하면 쿠폰이 1장 발급됩니다.
  • 가지고 있는 쿠폰이 총 10장이므로 서비스 치킨 1마리를 추가로 주문할 수 있습니다.
  • 따라서 108 + 10 + 1 + 1 = 120 을 return합니다.

 

solution.js

function solution(chicken) {
    var answer = parseInt((chicken-1) / 9);
    return answer;
}
  1. chicken이라는 매개변수를 받아들여서 처리합니다. 함수 내부에서는 chicken에서 1을 뺀 뒤, 그 값을 9로 나눈 몫을 계산하여 answer 변수에 저장합니다. 마지막으로 answer 값을 반환합니다.
  2. 예를 들어, chicken 값이 10이라면, 함수 내부에서는 (10-1) / 9를 계산하게 되고, 이는 1.1111...의 값을 가집니다. 하지만 parseInt 함수를 사용하여 소수 부분을 제거하고 정수 부분인 1만을 남기게 됩니다. 따라서 함수는 1을 반환합니다.
  3. 이 함수는 chicken 값에서 1을 뺀 뒤, 9로 나눈 몫을 계산하는 것으로 보아, chicken이 어떤 의미를 가지는지에 따라 반환되는 값이 달라질 수 있습니다. 함수의 이름이나 문맥에 따라 해당 값이 어떤 의미를 갖는지 알 수 있을 것입니다.

이진수 더하기

문제

이진수를 의미하는 두 개의 문자열 bin1과 bin2가 매개변수로 주어질 때, 두 이진수의 합을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • return 값은 이진수를 의미하는 문자열입니다.
  • 1 ≤ bin1, bin2의 길이 ≤ 10
  • bin1과 bin2는 0과 1로만 이루어져 있습니다.
  • bin1과 bin2는 "0"을 제외하고 0으로 시작하지 않습니다.

 

입출력 예

bin1 bin2 result
"10" "11" "101"
"1001" "1111" "11000"

 

입출력 예 설명

 

입출력 예 #1

  • 10 + 11 = 101 이므로 "101" 을 return합니다.

입출력 예 #2

  • 1001 + 1111 = 11000 이므로 "11000"을 return합니다.

 

solution.js

function solution(bin1, bin2) {
  var answer = '';
  var carry = 0;

  while (bin1.length < bin2.length) {
    bin1 = '0' + bin1;
  }
  while (bin1.length > bin2.length) {
    bin2 = '0' + bin2;
  }

  for (var i = bin1.length - 1; i >= 0; i--) {
    var bit1 = parseInt(bin1[i]);
    var bit2 = parseInt(bin2[i]);
    var sum = bit1 + bit2 + carry;

    if (sum >= 2) {
      carry = 1;
      sum -= 2;
    } else {
      carry = 0;
    }

    answer = sum + answer;
  }

  if (carry === 1) {
    answer = carry + answer;
  }

  return answer;
}
  1. answer 변수를 빈 문자열로 초기화하고, carry 변수를 0으로 초기화합니다.
  2. bin1과 bin2의 길이를 맞추기 위해 더 짧은 이진수의 앞에 0을 추가합니다. 이 작업을 while 루프를 사용하여 반복합니다.
  3. 이진수의 각 자릿수를 오른쪽부터 왼쪽으로 반복하면서 덧셈을 수행합니다. 이를 위해 for 루프를 사용하고, 루프 변수 i를 bin1의 길이에서 1씩 감소시키면서 반복합니다.
  4. 각 자릿수에서 bin1과 bin2의 해당 위치의 비트(bit1과 bit2)를 정수로 변환합니다.
  5. bit1, bit2, 그리고 carry 값을 더하여 sum을 계산합니다.
  6. 만약 sum이 2 이상인 경우, 올림(carry)이 발생한 것이므로 carry 값을 1로 설정하고 sum에서 2를 뺍니다.
  7. 그렇지 않은 경우(sum이 1 이하인 경우), carry 값을 0으로 설정합니다.
  8. sum 값을 answer의 왼쪽에 추가합니다.
  9. carry 값이 1인 경우, 가장 왼쪽 자릿수에 올림이 발생한 것이므로 answer의 가장 왼쪽에 carry 값을 추가합니다.
  10. 최종적으로 answer를 반환합니다.

A로 B 만들기

문제

문자열 before와 after가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 0 < before의 길이 == after의 길이 < 1,000
  • before와 after는 모두 소문자로 이루어져 있습니다.

 

입출력 예

before after result
"olleh" "hello" 1
"allpe" "apple" 0

 

입출력 예 설명

 

입출력 예 #1

  • "olleh"의 순서를 바꾸면 "hello"를 만들 수 있습니다.

입출력 예 #2

  • "allpe"의 순서를 바꿔도 "apple"을 만들 수 없습니다.

 

solution.js

function solution(before, after) {
  if (before.length !== after.length) {
    return 0;
  }

  var sortedBefore = before.split('').sort().join('');
  var sortedAfter = after.split('').sort().join('');

  if (sortedBefore === sortedAfter) {
    return 1;
  } else {
    return 0;
  }
}
  1. 만약 before와 after의 길이가 다르다면, 즉 서로 다른 문자열이라면 0을 반환합니다.
  2. before와 after를 각각 문자 단위로 분리하고, 정렬한 뒤 다시 합쳐서 새로운 문자열 sortedBefore와 sortedAfter를 생성합니다.
  3. sortedBefore와 sortedAfter를 비교하여 값이 동일하다면, 즉 문자열이 동일한 문자로 구성되어 있다면 1을 반환합니다.
  4. 그렇지 않은 경우, 즉 문자열이 다른 문자로 구성되어 있다면 0을 반환합니다.

이 함수의 목적은 beforeafter 문자열이 동일한 문자로 구성되어 있는지를 확인하는 것입니다. 함수는 두 문자열의 길이를 비교하고, 정렬한 후에 비교하여 같으면 1을 반환하고, 다르면 0을 반환합니다. 이를 통해 두 문자열이 동일한 문자로 구성되어 있는지 여부를 판단할 수 있습니다.


k의 개수

문제

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 ijk가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.

 

제한사항

  • 1 ≤ i < j ≤ 100,000
  • 0 ≤ k ≤ 9

 

입출력 예

i j k result
1 13 1 6
10 50 5 5
3 10 2 0

 

입출력 예 설명

 

입출력 예 #1

  • 본문과 동일합니다.

입출력 예 #2

  • 10부터 50까지 5는 15, 25, 35, 45, 50 총 5번 등장합니다. 따라서 5를 return 합니다.

입출력 예 #3

  • 3부터 10까지 2는 한 번도 등장하지 않으므로 0을 return 합니다.

 

solution.js

function solution(i, j, k) {
  var answer = 0;

  for (var num = i; num <= j; num++) {
    var digits = String(num).split('');
    var count = 0;

    for (var digit of digits) {
      if (Number(digit) === k) {
        count++;
      }
    }

    answer += count;
  }

  return answer;
}
  1. answer 변수를 0으로 초기화합니다.
  2. i부터 j까지의 모든 수에 대해 반복문을 실행합니다. 이를 위해 num 변수를 i로 초기화하고, num이 j보다 작거나 같은 동안 반복합니다.
  3. 각 숫자 num을 문자열로 변환한 뒤, digits 변수에 각 자릿수를 분리하여 저장합니다. 이를 위해 String(num)으로 num을 문자열로 변환하고, split('') 메소드를 사용하여 각 자릿수를 배열로 분리합니다.
  4. count 변수를 0으로 초기화합니다. 이 변수는 k와 일치하는 숫자의 개수를 세는데 사용됩니다.
  5. digits 배열의 각 자릿수(digit)에 대해 반복문을 실행합니다.
    • 만약 digit을 숫자로 변환한 값(Number(digit))이 k와 같다면, count를 1 증가시킵니다.
  6. answer에 count 값을 더합니다.
  7. 반복문이 종료되면 answer 값을 반환합니다.

이 함수의 목적은 i부터 j까지의 숫자들 중에서 각 숫자의 자릿수에 k가 몇 번 등장하는지를 계산하여 그 총합을 반환하는 것입니다. 함수는 주어진 범위 내에서 각 숫자를 문자열로 변환하고, 각 자릿수를 분리하여 순회하면서 k와 일치하는 숫자의 개수를 세고, 이를 answer에 누적하여 저장합니다. 마지막으로 answer 값을 반환합니다.

반응형
Adventure Time - BMO