알고리즘 먼데이 챌린지란?
참고 글: https://dev-neori.tistory.com/entry/goorm-monday-challenge-week2
각 점수들의 평균을 구하고 평균보다 높은 점수를 가진 학생을 구하는 문제입니다.
입력한 숫자들만 계산하기 편하도록 처리를 해준다면 쉬운 문제입니다.
입력한 숫자들을 이해하기 쉽도록 주석을 달자면 아래와 같습니다.
2 // 2번의 점수가 계산되어야 한다.
3 // 3명의 점수가 나올 예정이다.
1 3 7 // 3명의 점수
1 // 1명의 점수가 나올 예정이다.
5 // 1명의 점수
n명을 구하기 위해for(;;)
를 이용하여 홀수 줄만 순회하도록 하였으며 각 점수를 얻기 위해 i+1
줄에 split
을 사용했습니다.
합계를 구하고, 평균을 구해 다시 한 번 각 점수들을 돌며 평균보다 높은 점수라면 count를 증가시킵니다.
// Run by Node.js
const readline = require('readline');
const data = [];
(async () => {
let rl = readline.createInterface({ input: process.stdin });
for await (const line of rl) {
data.push(line);
rl.close();
}
const doubleCount = data[0] * 2;
for (let i = 1; i < doubleCount; i += 2) {
let successCount = 0;
const personCount = data[i];
const gradeArray = data[i + 1]
.split(' ')
.filter((grade) => grade !== '')
.map(Number);
const gradeSum = gradeArray.reduce((acc, cur) => acc + cur);
gradeArray.forEach((cur) => {
if (gradeSum / personCount <= cur) {
successCount++;
}
});
console.log(`${successCount}/${personCount}`);
}
process.exit();
})();
연속된 문자들을 제외한 모든 문자들의 개수를 구하는 문제입니다.
이전 문자를 저장하여 이전 문자와 같지 않다면 count를 증가시키도록 구현하였습니다.
// Run by Node.js
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
const data = [];
rl.on('line', (line) => {
data.push(line);
}).on('close', () => {
console.log(solution(data));
process.exit();
});
const solution = (data) => {
let count = 0;
let beforeWord = '';
const wordArray = data[1].toLowerCase().split('');
wordArray.forEach((cur) => {
if(cur !== beforeWord) count++;
beforeWord = cur;
})
return count;
};
입력된 문자에 대해 정렬을 하는 문제입니다.
sort 안에서 이름 순으로, 이름이 같다면 키 순서대로 정렬되도록 구현하였습니다.
// Run by Node.js
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
const data = [];
rl.on('line', (line) => data.push(line))
.on('close', () => { console.log(solution(data)); process.exit(); });
const solution = (data) => {
const [count, index] = data.shift().split(' ');
data.sort((a, b) => {
const [firstName, firstHeight] = a.split(' ');
const [secondName, secondHeight] = b.split(' ');
if(firstName < secondName) return -1;
else if(firstName > secondName) return 1;
else return Number(firstHeight) - Number(secondHeight);
});
return data[index-1];
};
2차원 배열을 이용하여 유효한 상하좌우라면 카운트를 계산하는 문제입니다.
dx와 dy는 상하좌우 값을 표시한 것입니다. 각각 다른 배열이 아닌, 인덱스 별로 계산하기에 (-1, 0) / (1, 0) / (0, -1) / (0, 1) 로 계산됩니다.
for(;;)
안에서 위 좌표처럼 사용되고 있습니다. 만약 상하좌우 값이 유효한 값 (= 배열에 넘어가지 않는 값) 이라면 board의 해당 좌표를 증가시킵니다.
// Run by Node.js
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const data = [];
rl.on('line', (line) => data.push(line)).on('close', () => {
console.log(solution(data));
process.exit();
});
const solution = (data = []) => {
const dx = [-1, 1, 0, 0];
const dy = [0, 0, -1, 1];
const [size, ] = data.shift().split(' ');
const board = Array.from(Array(Number(size) + 1), () => Array(Number(size) + 1).fill(0));
for (const point of data) {
const [x, y] = point.split(' ').map(Number);
board[x][y]++;
for (let i = 0; i < dx.length; i++) {
const bombX = x + dx[i];
const bombY = y + dy[i];
if (bombX >= 1 && bombX <= size && bombY >= 1 && bombY <= size) {
board[bombX][bombY]++;
}
}
}
return board.flat().reduce((acc, value) => acc + value, 0);
};