- Frederick Philips Brooks
Mythical Man-Month 저자
진료 순서 정하기
문제
외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.
정답풀이
function solution(emergency) {
let sorted = emergency.slice().sort((a,b)=>b-a);
return emergency.map(v=>sorted.indexOf(v)+1);
}
let sorted = emergency.slice().sort((a,b)=>b-a);: 이 줄은 emergency 배열의 복사본을 slice() 메서드를 사용하여 생성한 후, sort() 메서드를 사용하여 sorted라는 새 배열을 내림차순으로 정렬합니다. sort() 함수는 비교 함수인 (a, b) => b - a를 인수로 사용하여 내림차순으로 정렬되도록 합니다.
return emergency.map(v=>sorted.indexOf(v)+1);: 이 줄은 map() 메서드를 사용하여 emergency 배열을 기반으로 새로운 배열을 생성합니다. emergency 배열의 각 요소 v마다, 코드는 indexOf() 메서드를 사용하여 해당 요소의 sorted 배열에서의 인덱스를 찾고, 인덱스 값에 1을 더합니다. 그 결과로 생성된 배열이 solution 함수의 출력값으로 반환됩니다.
구슬을 나누는 경우의 수
문제
머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
문제풀이
function solution(balls, share) {
var answer = 0;
let dp = [];
dp[0] = 1;
for(let i = 1; i <= 30; i++)
dp[i] = dp[i-1] * i;
return Math.round(dp[balls] / (dp[balls - share] * dp[share]));
}
var answer = 0;: answer 변수를 0으로 초기화합니다. 이 변수는 함수의 결과값을 저장하는 변수입니다.
let dp = [];: 빈 배열 dp를 선언합니다. 이 배열은 동적 계획법(Dynamic Programming)을 사용하여 값을 저장하기 위한 배열입니다.
dp[0] = 1;: dp 배열의 첫 번째 요소에 1을 저장합니다. 이는 동적 계획법의 초기 조건을 설정하는 부분입니다.
for(let i = 1; i <= 30; i++): i를 1부터 30까지 반복하면서 아래의 작업을 수행합니다.
dp[i] = dp[i-1] * i;: 현재 인덱스 i의 값을 이전 인덱스 값 i-1과 i를 곱한 값으로 설정합니다. 이는 팩토리얼 값을 계산하기 위한 동적 계획법의 점화식입니다. dp[i]는 i! (팩토리얼)의 값을 저장하게 됩니다.
return Math.round(dp[balls] / (dp[balls - share] * dp[share]));: 계산된 동적 계획법의 결과값을 반환합니다. dp[balls]는 balls!의 값을 나타내고, dp[balls - share]와 dp[share]는 각각 (balls - share)!와 share!의 값을 나타냅니다. 따라서 dp[balls] / (dp[balls - share] * dp[share])는 balls! / ((balls - share)! * share!)를 계산한 결과입니다. Math.round() 함수를 사용하여 소수점 이하를 반올림합니다.
팩토리얼
문제
i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.
정답풀이
function solution(n) {
let result = 0
// 제한사항의 최대 값이 10의 팩토리얼이기 때문에 10번 반복
for(let i = 1 ; i <= 10; i++) {
// n이 i의 팩토리얼보다 크다면 진행하여 최대 i를 구함
if(n >= getFacto(i)) {
result = i
continue
} else {
break
}
}
return result
}
// 팩토리얼을 구하는 함수
function getFacto(num) {
// 재귀를 통해 n*n-1... 을 구현함
if(num > 1) return num*getFacto(num-1)
return num
}
함수는 주어진 문자열 letter를 모스 부호로 변환하는 기능을 수행합니다. 변환에 사용되는 모스 부호는 morse 객체에 저장되어 있습니다.
먼저, morse 객체는 알파벳에 대응하는 모스 부호를 키-값 쌍으로 가지고 있습니다.
answer 변수를 빈 문자열로 초기화합니다.
letter를 공백을 기준으로 분리하여 배열로 만듭니다. 그리고 result 변수에 할당합니다.
for...of 반복문을 사용하여 result 배열의 각 요소 x에 대해서 다음 작업을 수행합니다.
morseValue 변수에 morse 객체의 키들을 배열로 저장합니다.
morseValue.find() 메서드를 사용하여 x와 일치하는 모스 부호의 키를 찾습니다.
morse 객체에서 해당 키에 대응하는 알파벳을 answer에 추가합니다.
반복문이 종료되면 answer를 반환합니다. 이는 주어진 문자열 letter를 모스 부호로 변환한 결과를 나타냅니다.
예를 들어, letter가 ".- -... -.-."인 경우, 이는 "abc"를 나타내는 모스 부호입니다. 따라서 answer는 "abc"가 되어 반환됩니다.
A로 B 만들기
문제
문자열 before와 after가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.
정답풀이
function solution(before, after) {
let a = [...before].sort();
let b = [...after].sort();
return JSON.stringify(a) === JSON.stringify(b) ? 1 : 0
}
let a = [...before].sort();: before 배열의 복사본을 만들어 a 변수에 할당합니다. sort() 메서드를 사용하여 배열을 정렬합니다.
let b = [...after].sort();: after 배열의 복사본을 만들어 b 변수에 할당합니다. sort() 메서드를 사용하여 배열을 정렬합니다.
return JSON.stringify(a) === JSON.stringify(b) ? 1 : 0: 배열 a와 b를 JSON 문자열로 변환한 후, 문자열이 동일한지 비교합니다. 변환된 JSON 문자열은 배열의 요소와 순서를 포함하여 정확하게 비교할 수 있도록 합니다. 비교 결과에 따라 1 또는 0을 반환합니다.