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

미소·2022년 11월 11일
0

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

문제 풀이

1. 합격자 찾기

각 점수들의 평균을 구하고 평균보다 높은 점수를 가진 학생을 구하는 문제입니다.
입력한 숫자들만 계산하기 편하도록 처리를 해준다면 쉬운 문제입니다.

예시 입력1

입력한 숫자들을 이해하기 쉽도록 주석을 달자면 아래와 같습니다.

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();
})();

2. 철자 분리 집합

연속된 문자들을 제외한 모든 문자들의 개수를 구하는 문제입니다.

정답 코드

이전 문자를 저장하여 이전 문자와 같지 않다면 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;
};

3. 출석부

입력된 문자에 대해 정렬을 하는 문제입니다.

정답 코드

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];
};

4. 폭탄 구현하기

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);
};
profile
https://blog.areumsheep.vercel.app/ 으로 이동 중 🏃‍♀️

0개의 댓글