자바스크립트 기본 알고리즘
2023.03.07 10:55:17
왼쪽부터 처리했을 때랑 오른쪽부터 처리했을 때랑 결과가 다르다...
그래서 일단 둘 다 구하고, 더 적합한 쪽을 답으로 리턴하도록 했다.
아무래도 하드코딩 같다
function solution(n, lost, reserve) {
var answer = 0;
let hash = {}
let hash2 = {}
let cannot = []
lost.forEach(e => {
hash[e] = 1
hash2[e] = 1
})
reserve.forEach(e => {
if(hash[e]) {
hash[e] -= 1
hash2[e] -= 1
}
})
reserve.forEach(e => {
if(hash[e] !==0){
if (hash[e-1]) {
hash[e-1] -= 1
} else if (hash[e+1]) {
hash[e+1] -= 1
}
if (hash2[e+1]) {
hash2[e+1] -= 1
} else if (hash2[e-1]) {
hash2[e-1] -= 1
}
}
})
// console.log(Object.values(hash))
answer = n - Math.min(Object.values(hash).reduce((acc, val) => acc+val), Object.values(hash2).reduce((acc, val) => acc+val))
return answer;
}
ChatGPT를 쪼아서 1차원 배열을 이용하는 답안을 얻어냈다.
위의 해시맵을 이용한 풀이와 달리 '잃어버린 사람'이 기준이 되어 순회하기 때문에 결과적으로 왼쪽부터 처리한 결과랑 오른쪽부터 처리한 결과가 동일해진다.
단, 앞에서 부터 순회를 했다면 앞에서 부터 빌리고, 뒤에서 부터 순회했다면 뒤에서 부터 빌린다.
즉 앞에서 부터 문제를 처리해나가는 Greedy 문제라고 할 수 있다.
function solution(n, lost, reserve) {
let students = Array(n).fill(1);
// 체육복을 잃어버린 학생들 처리
lost.forEach(num => {
students[num - 1]--;
});
// 여벌의 체육복이 있는 학생들 처리
reserve.forEach(num => {
students[num - 1]++;
});
// 체육복을 빌리기 위해 앞이나 뒤의 학생에게 체육복을 빌리는 처리
for (let i = 0; i < n; i++) {
if (students[i] === 0) {
if (students[i - 1] === 2) {
students[i - 1]--;
students[i]++;
} else if (students[i + 1] === 2) {
students[i + 1]--;
students[i]++;
}
}
}
// 체육복을 입을 수 있는 학생들의 수 계산
let answer = students.filter(num => num >= 1).length;
return answer;
}