[구름] 알고리즘 먼데이 챌린지 1주차 (JavaScript 풀이)

미소·2022년 11월 6일
0

알고리즘 먼데이 챌린지란?
참고 글: https://dev-neori.tistory.com/entry/goorm-monday-challenge-week1

문제 풀이

해당 풀이의 히스토리 / 배운 내용은 노션에서 확인하실 수 있습니다.

1. 경로의 개수

경우의 수를 구하는 문제입니다. 각 숫자를 더하면 되는 문제이나 함정이 숨겨져 있습니다.
바로 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. 동명이인

해당 문제는 간단합니다. 주어진 이름과 같은 이름이 있는지 확인하는 문제입니다.
하지만 아래 문제는 다음과 같은 방법으로 풀 수 있습니다.

  1. 미리 선언한 RegExp 변수로 for문을 돌며 같은 이름 찾기
  2. includes로 같은 이름이 있는지 for문으로 확인하기
  3. for문으로 RegExp 객체를 계속 생성하며 같은 이름 찾기
  4. reduce + 미리 선언한 RegExp 변수로 같은 이름 찾기

처음 작성한 코드는 2번이었으나 참고 글을 보니 정규표현식으로 이름을 비교하는 방법이 있어 궁금한 나머지 성능 측정을 해보았습니다.

https://jsben.ch/y7UzU

결론적으론 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;
};

3. 최장 맨해튼 거리

해당 문제는 숫자 배열을 오름차순으로 정렬한 뒤 (가장 큰 수 - 가장 작은 수) + (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();
})();

4. 소수 찾기

해당 문제는 소수를 구하면 됩니다.

  1. 0 ~ 끝 번째까지 반복문으로 index+1이 소수인지 확인합니다.
    a. 2 ~ 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;
};
profile
https://blog.areumsheep.vercel.app/ 으로 이동 중 🏃‍♀️

0개의 댓글