한번씩 읽고 가세요.
“ 지연되는 프로젝트에 인력을 더 투입하면 오히려 더 늦어진다. ”
- Frederick Philips Brooks
Mythical Man-Month 저자
Ugly Numbers
심술쟁이 수는 2,3,5의 곱으로 만들 수 있는 수이다. 다음과 같은 순서의 수가 11개의 심술쟁이 수이다.
1,2,3,4,5,6,8,9,10,12,15,....
처음 수는 1로 시작하도록 한다. 입력은 받지 않고, <number> 에 1500번째 심술쟁이 수가 출력되게 한다.
Sample Output
The 1500'th ugly number is <number>.
답
859963392
(1550번째는 1093500000, 십만번째는 290142196707511001929482240000000000000)
function uglyNumber(n){
let ugly_number_list = [1]
for(i = 0; i < n-1; i++){
let last = ugly_number_list.slice(-1)
let temp = []
for (let i of ugly_number_list){
for (let j of [i*2, i*3, i*5]){
if (j > last){
temp.push(j)
}
}
}
ugly_number_list.push(Math.min(...temp))
}
return ugly_number_list.slice(-1)
}
uglyNumber(1500)
숫자 n에 해당하는 "추악적인 수(Ugly number)"를 계산하는 함수인 uglyNumber를 구현한 것입니다. 추악적인 수는 오직 2, 3, 5로만 나누어지는 양의 정수입니다.
uglyNumber 함수는 다음과 같이 작동합니다:
- ugly_number_list라는 배열을 초기화하고 1을 첫 번째 요소로 추가합니다. 이 배열은 추악적인 수들을 저장할 것입니다.
- for 루프를 사용하여 n-1번 반복합니다. n-1번 반복하는 이유는 이미 첫 번째 요소로 1이 추가되었기 때문입니다.
- ugly_number_list 배열의 마지막 요소를 last 변수에 할당합니다.
- 빈 배열인 temp을 선언합니다. 이 배열은 현재까지 생성된 추악적인 수들에 2, 3, 5를 곱한 값을 저장할 것입니다.
- 중첩된 for 루프를 사용하여 ugly_number_list 배열의 각 요소 i에 대해 2, 3, 5를 곱한 값을 j 변수에 할당합니다.
- 만약 j가 last보다 크다면, temp 배열에 추가합니다. 이는 이미 생성된 추악적인 수보다 큰 수만을 고려하기 위함입니다.
- temp 배열에서 가장 작은 값을 찾아 ugly_number_list 배열에 추가합니다.
- 반복이 완료되면 ugly_number_list 배열의 마지막 요소, 즉 ugly_number_list.slice(-1)을 반환하여 계산된 n번째 추악적인 수를 반환합니다.
마지막으로, uglyNumber 함수를 호출하여 n이 1500인 경우의 추악적인 수를 계산하고 결과를 반환합니다.
Two Printers
John과 Mary는 "J&M 출판사"를 설립하고 낡은 프린터 2대를 구입하였다.
그들이 첫번째로 성사시킨 거래는 N개의 페이지로 구성된 문서를 출력하는 일이었다.
그들이 구입한 두 대의 프린터는 각기 다른 속도록 문서를 출력하고 있다고 한다. 하나는 한 페이지를 출력하는 데 X초가 걸리고 다른 하나는 Y초가 소요된다고 한다.
John과 Mary는 두 대의 프린터를 이용하여 전체 문서를 출력하는 데 드는 최소한의 시간이 알고 싶어졌다.
입력과 출력
입력데이터의 첫번 째 라인은 테스트케이스의 갯수를 뜻하고 그 갯수만큼의 라인이 추가로 입력된다. 추가되는 각 라인은 세 개의 정수값 X Y N 으로 구성된다. X는 첫번째 프린터가 한 페이지를 출력하는 데 드는 소요시간, Y는 두번째 프린터가 한 페이지를 출력하는 데 드는 소요시간을 뜻하고 N은 출력할 문서의 총 페이지 수를 의미한다. (단, 출력할 문서의 총 페이지 수는 1,000,000,000개를 초과하지 않는다.)
출력은 프린팅에 드는 최소한의 시간을 테스트케이스의 갯수만큼 공백으로 구분하여 출력하도록 한다.
입출력의 예는 다음과 같다:
input data:
2
1 1 5
3 5 4
answer:
3 9
function solution(x, y, page){
let time = 1
while (true) {
if (Math.floor(time / x) + Math.floor(time / y) >= page) {
return time
}
time += 1
}
}
two_printers(1, 1, 5)
two_printers(3, 5, 4)
two_printers(1, 100, 1)
two_printers(1, 100, 2)
두 대의 프린터로 페이지를 출력하는 데 필요한 최소한의 시간을 계산하는 함수인 solution을 구현한 것입니다. 함수는 주어진 두 프린터의 출력 속도 x와 y, 그리고 필요한 페이지 수 page를 입력으로 받습니다.
solution 함수는 다음과 같이 작동합니다:
- time 변수를 1로 초기화합니다. 이 변수는 시간을 나타내며, 1부터 시작하여 점차 증가시킵니다.
- 무한 루프를 실행합니다.
- 현재 시간 time을 이용하여 첫 번째 프린터로 인쇄한 페이지 수와 두 번째 프린터로 인쇄한 페이지 수를 계산합니다. 이를 위해 Math.floor(time / x)와 Math.floor(time / y)를 사용합니다.
- 첫 번째 프린터로 인쇄한 페이지 수와 두 번째 프린터로 인쇄한 페이지 수를 더한 값이 필요한 페이지 수 page보다 크거나 같은지 확인합니다.
- 만약 크거나 같다면, 현재 시간 time을 반환하여 최소한의 시간을 나타냅니다.
- 필요한 페이지 수 page보다 작다면, time을 1 증가시켜 다음 시간으로 넘어갑니다.
마지막으로, solution 함수를 호출하여 주어진 예제의 경우 두 프린터로 페이지를 출력하는 데 필요한 최소한의 시간을 계산하고 결과를 반환합니다.