필요한 개념
- 정렬
- loop vs reduce
문제 분석
햄버거를 구성하는 N개의 재료가 순서대로 주어졌을 때, 조건대로 정렬되어 있는지 확인하는 문제이다.
이때 정렬의 조건은 가장 높은 정수를 기준으로, 왼쪽이나 오른쪽으로 갈 수록 정수의 값이 같거나 감소되어야 한다.
문제를 해결하기 위해서는 주어진 값 중 가장 큰 값의 위치를 찾아야 한다.
그 다음에는 큰 값의 위치를 기준으로 앞의 값들은 오름차순으로 배열되어 있는지, 뒤의 값들은 내림차순으로 배열되어 있는지 확인하면 된다.
이 값이 문제가 없다면 완벽한 햄버거이고, 아니라면 완벽한 햄버거가 아니다.
데이터 입력 받기
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let input = [];
rl.on('line', (line) => {
input.push(line.trim());
if (input.length === 2){
rl.close();
}
})
가장 큰 값 찾기
데이터 입력을 받은 뒤, 변수를 정리한다.
// 모든 데이터는 input에 저장
rl.on('close', () => {
let n = Number(input[0]);
let arr = input[1].split(' ').map(Number);
});
배열에서 가장 큰 정수를 찾고, 그 위치를 기준으로 배열을 분리한다.
rl.on('close', () => {
..code
let chk = arr.indexOf(Math.max(...arr));
let left = arr.slice(0, chk);
let right = arr.slice(chk);
});
정렬하기
chk를 기준으로 나누어진 left와 right 배열을 각각 오름차순, 내림차순으로 정렬한다.
rl.on('close', () => {
..code
left.sort();
right.sort((a, b) => b - a);
// 2개의 배열을 합할 때는 [...arr1, ...arr2] 를 사용하면 편하다.
let sortedArr = [...left, ...right];
});
배열 비교하기
두개의 배열을 비교하는 방법은 두가지가 있다.
JSON을 사용하면 간결하지만, 크기가 큰 배열에서는 반복문으로 직접 구현하는 것이 더 효율적이다.
1. JSON 사용하기
if (JSON.stringify(arr1) === JSON.stringify(arr2) ){
console.log("2개의 배열은 같다.");
} else{
console.log("2개의 배열은 다르다.")
}
2. 반복문으로 비교하기
function arraysAreEqual(array1, array2) {
//배열의 길이나 요소가 다르다면 다른 배열이다.
if (array1.length !== array2.length) {
return false;
}
for (let i = 0; i < array1.length; i++) {
if (array1[i] !== array2[i]) {
return false;
}
}
return true;
}
reduce vs loop
배열을 비교해서 올바른 햄버러가면, 배열에 있는 모든 값을 더해 출력한다.
reduce 사용하기
// a = 축적값, b = 리스트의 값, 0 => 축적값의 초기값
// reduce((축적값, 다음 요소) => 처리할 코드, 축적 값의 초기값)
arr.reduce((a, b) => a + b, 0);
loop 사용하기
let sum = 0;
for(let i = 0; i < arr.length; i++) {
sum += arr[i];
}
처음에 배열을 나눌 생각을 못하고 배열 요소들의 차이가 같은지를 비교하려고 해서 문제가 풀리지 않았다.
왜 그런지 다시 문제를 보니 이해를 잘 못하고 있어서 그런 거였다.
그래서 결국 풀긴 했지만 시간이 너무 오래 걸렸다.
아직 생각하고 구현해내는 연습이 덜 된 것 같아서 구름톤 챌린지를 하면서 계속 연습을 해야겠다.
'JavaScript' 카테고리의 다른 글
[구름톤 챌린지] 2주차_폭탄 구현하기 (0) | 2023.08.25 |
---|---|
[구름톤 챌린지] 2주차_문자열 나누기 (0) | 2023.08.22 |
[구름톤 챌린지] 1주차_프로젝트 매니징 (0) | 2023.08.17 |
event, event handler (0) | 2023.06.29 |
async & await (0) | 2023.06.26 |