“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”
코딩테스트 입문 Day 8 배열, 구현, 수학
출처 : https://programmers.co.kr/
배열 자르기
문제
정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
- 2 ≤ numbers의 길이 ≤ 30
- 0 ≤ numbers의 원소 ≤ 1,000
- 0 ≤num1 < num2 < numbers의 길이
입출력 예
numbers | num1 | num2 | result |
[1, 2, 3, 4, 5] | 1 | 3 | [2, 3, 4] |
[1, 3, 5] | 1 | 2 | [3, 5] |
입출력 예 설명
입출력 예 #1
- [1, 2, 3, 4, 5]의 1번째 인덱스 2부터 3번째 인덱스 4 까지 자른 [2, 3, 4]를 return 합니다.
입출력 예 #2
- [1, 3, 5]의 1번째 인덱스 3부터 2번째 인덱스 5까지 자른 [3, 5]를 return 합니다.
solution.js
function solution(numbers, num1, num2) {
var answer = numbers.slice(num1, num2 + 1);
return answer;
}
- answer라는 변수를 선언하고, numbers 배열의 num1부터 num2까지의 요소를 추출하여 저장합니다. 이 때, slice 메서드를 사용하여 배열의 일부분을 추출합니다. num1은 시작 인덱스이고, num2 + 1은 끝 인덱스로 설정되어야 합니다. 끝 인덱스는 포함되지 않으므로 num2 + 1이 사용됩니다.
- answer 배열을 반환합니다.
예를 들어, numbers 배열이 [1, 2, 3, 4, 5]이고, num1이 1이고, num2가 3이라면, 함수는 [2, 3, 4]를 반환합니다. 왜냐하면 numbers 배열에서 인덱스 1부터 인덱스 3까지의 요소를 추출하기 때문입니다.
외계행성의 나이
문제
우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.
제한사항
- age는 자연수입니다.
- age ≤ 1,000
- PROGRAMMERS-962 행성은 알파벳 소문자만 사용합니다.
입출력 예
age | result |
23 | "cd" |
51 | "fb" |
100 | "baa" |
입출력 예 설명
입출력 예 #1
- age가 23이므로 "cd"를 return합니다.
입출력 예 #2
- age가 51이므로 "fb"를 return합니다.
입출력 예 #3
- age가 100이므로 "baa"를 return합니다.
solution.js
function solution(age) {
var answer = '';
while (age > 0) {
var remainder = age % 10;
var alpha = String.fromCharCode(97 + remainder);
answer = alpha + answer;
age = Math.floor(age / 10);
}
return answer;
}
- answer라는 빈 문자열을 선언합니다. 이 변수는 결과 문자열을 저장할 용도로 사용됩니다.
- while 루프를 사용하여 age가 0보다 큰 동안 반복합니다.
- remainder라는 변수를 선언하고, age를 10으로 나눈 나머지를 저장합니다. remainder 변수는 age의 가장 오른쪽 자릿수를 나타냅니다.
- alpha라는 변수를 선언하고, remainder에 97을 더한 후, String.fromCharCode 메서드를 사용하여 해당 숫자에 해당하는 알파벳 문자열을 얻습니다. 이 때, 97은 소문자 'a'의 유니코드 값입니다.
- answer 변수에 alpha를 현재 결과 문자열의 가장 왼쪽에 추가합니다. 이렇게 함으로써 answer 문자열이 역순으로 구성됩니다.
- age를 10으로 나눈 몫을 구하여 age 변수에 다시 할당합니다. Math.floor 함수를 사용하여 정수 몫을 얻습니다.
- while 루프가 종료되면, answer 문자열이 완성되었습니다.
- answer 문자열을 반환합니다.
예를 들어, age 값이 123이라면, 함수는 'cba'를 반환합니다. 왜냐하면 age 값을 자릿수로 분리하고, 각 자릿수에 대응하는 알파벳 문자열을 생성하여 역순으로 이어붙였기 때문입니다.
진료순서 정하기
문제
외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
- 중복된 원소는 없습니다.
- 1 ≤ emergency의 길이 ≤ 10
- 1 ≤ emergency의 원소 ≤ 100
입출력 예
emergency | result |
[3, 76, 24] | [3, 1, 2] |
[1, 2, 3, 4, 5, 6, 7] | [7, 6, 5, 4, 3, 2, 1] |
[30, 10, 23, 6, 100] | [2, 4, 3, 5, 1] |
입출력 예 설명
입출력 예 #1
- emergency가 [3, 76, 24]이므로 응급도의 크기 순서대로 번호를 매긴 [3, 1, 2]를 return합니다.
입출력 예 #2
- emergency가 [1, 2, 3, 4, 5, 6, 7]이므로 응급도의 크기 순서대로 번호를 매긴 [7, 6, 5, 4, 3, 2, 1]를 return합니다.
입출력 예 #3
- emergency가 [30, 10, 23, 6, 100]이므로 응급도의 크기 순서대로 번호를 매긴 [2, 4, 3, 5, 1]를 return합니다.
solution.js
function solution(emergency) {
let sorted = emergency.slice().sort((a,b)=>b-a);
return emergency.map(v=>sorted.indexOf(v)+1);
}
- sorted라는 변수를 선언하고, emergency 배열의 복사본을 만든 후, sort 메서드를 사용하여 내림차순으로 정렬합니다. 이렇게 함으로써 sorted 배열은 원래 배열의 요소들이 큰 순서대로 정렬된 상태를 가지게 됩니다.
- emergency 배열의 각 요소에 대해 map 메서드를 사용하여 반복 작업을 수행합니다. map 메서드는 콜백 함수를 호출하며, 각 요소를 순회하면서 실행됩니다.
- 콜백 함수의 매개변수 v는 현재 순회 중인 요소를 나타냅니다.
- sorted 배열에서 v의 인덱스를 indexOf 메서드를 사용하여 찾고, 1을 더한 값을 반환합니다. 이렇게 함으로써 v가 원래 배열에서 몇 번째로 큰 요소인지를 나타내는 값이 map 메서드에 의해 생성되는 새로운 배열에 저장됩니다.
- map 메서드가 종료되면, 원래 배열의 요소들에 대한 순서 정보가 담긴 새로운 배열이 완성됩니다.
- 이 배열을 반환합니다.
예를 들어, emergency 배열이 [3, 5, 2, 4, 1]이라면, 함수는 [2, 1, 3, 2, 5]를 반환합니다. 왜냐하면 emergency 배열에서 각 요소가 원래 배열에서 몇 번째로 큰 요소인지를 나타내는 배열을 생성하기 때문입니다. 원래 배열에서 3은 두 번째로 크므로 2가 할당되고, 5는 가장 크므로 1이 할당되는 식입니다.
순서쌍의 개수
문제
순서쌍이란 두 개의 숫자를 순서를 정하여 짝지어 나타낸 쌍으로 (a, b)로 표기합니다. 자연수 n이 매개변수로 주어질 때 두 숫자의 곱이 n인 자연수 순서쌍의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 1,000,000
입출력 예
n | result |
20 | 6 |
100 | 9 |
입출력 예 설명
입출력 예 #1
- n이 20 이므로 곱이 20인 순서쌍은 (1, 20), (2, 10), (4, 5), (5, 4), (10, 2), (20, 1) 이므로 6을 return합니다.
입출력 예 #2
- n이 100 이므로 곱이 100인 순서쌍은 (1, 100), (2, 50), (4, 25), (5, 20), (10, 10), (20, 5), (25, 4), (50, 2), (100, 1) 이므로 9를 return합니다.
solution.js
function solution(n) {
let answer = 0;
for (let i = 1; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
if (i * i === n) {
answer++;
} else {
answer += 2;
}
}
}
return answer;
}
- answer라는 변수를 선언하고, 초기값을 0으로 설정합니다. 이 변수는 약수의 개수를 저장할 용도로 사용됩니다.
- for 루프를 사용하여 i 변수를 1부터 n의 제곱근까지 1씩 증가시키면서 반복합니다. 이렇게 함으로써 i는 n의 약수 후보가 됩니다.
- if 문을 사용하여 n이 i로 나누어 떨어지는지 확인합니다. 즉, n이 i의 약수인지 확인합니다.
- n이 i로 나누어 떨어진다면, if 문 내부로 진입합니다.
- if 문 내부에서는 i가 n의 제곱근인지를 확인합니다. 이를 통해 중복 약수인 경우를 제외합니다. 만약 i가 n의 제곱근이라면, answer를 1 증가시킵니다.
- 그렇지 않은 경우, i와 n을 나눈 다른 약수를 찾은 것이므로, answer를 2 증가시킵니다. 예를 들어, n이 12이고, i가 3인 경우, 3과 12를 나누는 다른 약수인 4를 찾은 것입니다.
- for 루프가 종료되면, answer 변수에는 n의 약수의 개수가 저장됩니다.
- answer 값을 반환합니다.
예를 들어, n이 12라면, 함수는 6을 반환합니다. 왜냐하면 12의 약수는 1, 2, 3, 4, 6, 12로 총 6개이기 때문입니다.