알고리즘 먼데이 챌린지란?
참고 글: https://dev-neori.tistory.com/entry/goorm-monday-challenge-week1
해당 풀이의 히스토리 / 배운 내용은 노션에서 확인하실 수 있습니다.
경우의 수를 구하는 문제입니다. 각 숫자를 더하면 되는 문제이나 함정이 숨겨져 있습니다.
바로 int의 범위를 넘어가는 수의 경우 BigInt를 활용해 계산이 되어야 합니다.
// Run by Node.js
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
let data = [];
rl.on('line', (line) => {
data.push(line);
}).on('close', () => {
console.log(solution(data));
process.exit();
});
const solution = (data) => {
const bridge = data[1].split(' ');
const sum = bridge.reduce((acc, cur) => {
return acc *= BigInt(cur); // BigInt로 계산하면 정상적으로 테스트가 완료됩니다.
}, 1n).toString();
return sum;
};
해당 문제는 간단합니다. 주어진 이름과 같은 이름이 있는지 확인하는 문제입니다.
하지만 아래 문제는 다음과 같은 방법으로 풀 수 있습니다.
처음 작성한 코드는 2번이었으나 참고 글을 보니 정규표현식으로 이름을 비교하는 방법이 있어 궁금한 나머지 성능 측정을 해보았습니다.
결론적으론 2번 코드가 가장 효율적인 코드였기에 2번을 정답으로 사용하였습니다.
// Run by Node.js
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
let data = [];
rl.on('line', (line) => {
data.push(line);
}).on('close', () => {
console.log(solution(data));
process.exit();
});
const solution = (data) => {
let count = 0;
const firstLine = data.shift();
const [repeat, standardName] = firstLine.split(' ');
for(const name of data){
if(name.includes(standardName)) count++;
}
return count;
};
해당 문제는 숫자 배열을 오름차순으로 정렬한 뒤 (가장 큰 수 - 가장 작은 수) + (2번째로 큰 수 - 2번째로 작은 수)
공식을 이용하면 됩니다.
😱 문제의 3~10번 테스트 케이스에 오류가 있기에
trim()
을 이용하여 공백을 제거해야 합니다.
// Run by Node.js
const readline = require('readline');
(async () => {
let rl = readline.createInterface({ input: process.stdin });
for await (const line of rl) {
const point = line.trim().split(' ').map(Number);
point.sort((a,b) => a-b);
let [x1, y1, y2, x2] = [...point];
console.log(x2 - x1 + y2 - y1);
rl.close();
}
process.exit();
})();
해당 문제는 소수를 구하면 됩니다.
index+1
이 소수인지 확인합니다.index+1의 제곱근
까지 확인했을 때 나누어지는 수가 있다면 해당 수는 소수입니다. // Run by Node.js
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
let data = [];
rl.on('line', (line) => {
data.push(line);
}).on('close', () => {
console.log(solution(data));
process.exit();
});
const solution = (data) => {
data.shift();
const numbers = data[0].split(' ').map(Number);
// 소수 구하기
const result = numbers.reduce((acc, number, index) => {
// index+1이 만약 소수라면
if (isPrime(index+1)) {
return acc += number;
}
return acc;
}, 0);
return result;
};
const isPrime = (n) => {
if (n < 2) return false;
for (i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) return false;
}
return true;
};