728x90
📌 문제
구름 햄버거는 다양한 재료를 사용하여 만들어서 맛있기로 유명하다. 구름 햄버거는 N개의 재료를 순서대로 쌓아서 만들고, 구름 햄버거의 맛은 사용된 모든 재료의 맛의 정도를 더한 값이다.
완벽한 구름 햄버거를 만들기 위해서는 맛의 정도가 가장 높은 재료를 기준으로 위랑 아래로 갈수록 재료의 맛의 정도가 감소하거나 같아야 한다.
플레이어는 N개의 재료를 순서대로 쌓아서 구름 햄버거를 하나 만들었다. i번째로 쌓은 재료의 맛의 정도가 ki 라고 할 때, 플레이어가 만든 구름 햄버거의 맛을 구해보자. 만약 플레이어가 완벽하지 않은 구름 햄버거를 만들었다면 0을 출력한다.
📌 입력
첫째 줄에 구름 햄버거에 들어가는 재료의 개수 N개가 주어진다.
그다음 줄에 플레이어가 햄버거를 만들 때 쓴 재료의 맛의 정도 k1...kn 가 공백을 두고 주어진다.
- 1 <= N <= 1000
- 1 <= ki <= 10^6
입력에서 주어지는 모든 수는 정수이다.
📌 출력
플레이어가 만든 구름 햄버거의 맛을 출력한다.
만약 플레이어가 완벽하지 않은 구름 햄버거를 만들었다면 0을 출력한다.
📌 예제 입출력
📌 풀이
알아야 하는 것
- indexOf
- slice
- sort
- JSON.stringify
- reduce
구할 것
- 주어진 값 중 두 번째 값에서 가장 큰 값을 기준으로 왼쪽은 오름차순, 오른쪽은 내림차순으로 정렬되어야 한다.
- 이 조건을 지켰다면 모든 값을 더해주고, 이 조건을 지키지 않았다면 0을 출력해준다.
- 먼저 가장 큰 값을 indexOf와 Math.max로 찾은 후 그 수를 max라고 할 때, max를 기준으로 왼쪽 left와 오른쪽 right을 slice로 나누어준다.
- left, right를 정렬할 것인데 그냥 sort를 하면 원본 배열이 훼손되기 때문에 slice()로 그대로 복사한 후 오름차순, 내림차순으로 각자 정렬해준다.
- 이후 배열을 비교하는 방법은 2가지가 있다.
- JSON.stringify로 배열을 문자열로 만들기: 배열 안의 값과 순서를 모두 확인할 수 있다. (크기가 크면 비효율적)
- 반복문으로 비교하기: 배열의 길이도 같아야 하고, 인덱스끼리 비교했을 때도 같아야 한다. (직접 구현해야 함)
- 단순히 ===으로 비교를 하게 되면 배열의 참조값으로 비교를 하게 되는데, 그러면 값이 같아도 참조값이 다르기 때문에 무조건 false가 나온다. 따라서 배열 자체만 볼 수 있도록 2가지 방법 중 하나를 택해 비교한다.
- 비교를 했을 때 같다면 reduce로 해당 배열의 값을 누적해 더해준다. 이 때 max를 기준으로 나누었기 때문에 max값도 추가해준다. 만약 같지 않다면 sum = 0 이 출력되게 조건문을 더해준다.
const readline = require('readline');
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on('line', (line) => {
input.push(line)
if (input.length === 2) {
rl.close();
}
});
rl.on('close', () => {
let numOfIngredient = Number(input.shift());
let ingredient = input[0].split(" ").map(Number);
let max = ingredient.indexOf(Math.max(...ingredient)); // 가장 맛있는 재료의 index
let left = ingredient.slice(0, max); // 가장 맛있는 재료의 왼쪽
let right = ingredient.slice(max + 1); // 가장 맛있는 재료의 오른쪽
let sum = 0; // 합계
let sortedLeft = left.slice().sort((a, b) => a - b); // 가장 맛있는 재료의 왼쪽을 복사해 오름차순으로 정렬
let sortedRight = right.slice().sort((a, b) => b - a); // 가장 맛있는 재료의 오른쪽을 복사해 내림차순으로 정렬
console.log(right, sortedRight)
if (
JSON.stringify(left) === JSON.stringify(sortedLeft) &&
JSON.stringify(right) === JSON.stringify(sortedRight)
) {
sum += left.reduce((acc, cur) => acc + cur, 0);
sum += right.reduce((acc, cur) => acc + cur, 0);
sum += Math.max(...ingredient);
} else {
sum = 0;
}
console.log(sum);
});
JSON.stringify를 알고리즘에 적용해본 건 처음이었다.
📌 문제
문제
📌 입력
입력
📌 출력
출력
📌 예제 입출력
📌 풀이
알아야 하는 것
- 알
구할 것
- 구
const readline = require('readline');
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input;
rl.on('line', (line) => {
input = line;
rl.close();
});
rl.on('close', () => {
let [weight, repeat] = input.split(" ").map(Number)
console.log(parseInt(weight * (1+repeat/30)));
})
728x90
'⚙️ 코딩테스트' 카테고리의 다른 글
[JavaScript] 구름톤 챌린지 2주차 코딩테스트 : 문자열 나누기 (0) | 2023.08.22 |
---|---|
[JavaScript] 구름톤 챌린지 1주차 코딩테스트 : 이진수 정렬 (0) | 2023.08.21 |
[JavaScript] 구름톤 챌린지 1주차 코딩테스트 : 합 계산기 (0) | 2023.08.17 |
[JavaScript] 구름톤 챌린지 1주차 코딩테스트 : 프로젝트 매니징 (0) | 2023.08.16 |
[JavaScript] 구름톤 챌린지 1주차 코딩테스트 : 운동 중독 플레이어 (0) | 2023.08.16 |