코딩연습

[백준 알고리즘] Node.js 1417. 국회의원 선거

니 뽀 2023. 8. 7. 16:02

1. 문제

https://www.acmicpc.net/problem/1417

 

1417번: 국회의원 선거

첫째 줄에 후보의 수 N이 주어진다. 둘째 줄부터 차례대로 기호 1번을 찍으려고 하는 사람의 수, 기호 2번을 찍으려고 하는 수, 이렇게 총 N개의 줄에 걸쳐 입력이 들어온다. N은 50보다 작거나 같

www.acmicpc.net

 

2. 풀이

  • 맨 처음은 후보 수 N이 오고, 두번째줄부터 후보에 해당하는 표수가 나온다. 그 중 첫번째가 다솜이가 받을 표다.
  • 가장 많은 표를 받기 위해서 다른 사람의 표를 가져와야 한다.
const [N, ...inputs] = require('fs').readFileSync('/dev/stdin').toString().trim().split("\n").map(v => +v);

const sol = () => {
  let count = 1; // 몇표를 받았는지 확인할 변수
  let vote = inputs[0]; // 다솜이가 받은 표.
  
  // 첫번째인지 확인할 변수, 가장 처음 비교할 때 다솜이가 가장 많은 표를 가지고 있다면 count가 0이 되어야 함.
  let isFirst = false; 

  while(true){
    vote += 1; // 다솜이 표 하나 증가.

    let maxVal = Math.max.apply(null, inputs); // 투표 수 중 가장 큰 값 찾기.
    let maxIndex = inputs.findIndex(i => i === maxVal); // 가장 큰 값의 인덱스 값 찾기.

	// 첫번째 비교를 할 때, 다솜이가 가장 많은 표를 가지고 있는지 확인하기 위함.
    if(count === 1 && maxIndex === 0 && inputs.filter(i => i === maxVal).length === 1) {
      isFirst = true;
      break;
    }
	
    // 다솜이 표 하나 증가헀으니, 가장 많이 받은 사람의 표 하나 감소.
    inputs[maxIndex]--;
	
    // 다시 가장 큰 값을 다솜이의 표가 비교.
    let compareVal = Math.max.apply(null, inputs);
    if(vote > compareVal) break;

    count++; // 다솜이의 표가 가장 많지 않다면 count증가.
  }
	
  // 만약 첫번째 비교에서 다솜이의 표가 가장 많다면 증가할 필요가 없기 때문에 0. 그외의 비교엔 count  
  return isFirst ? 0 : count;
}

// 국회의원 선거에 나온 사람이 1명이라면 0, 아니라면 sol 함수의 리턴값을 출력.
if(N === 1) console.log(0);
else console.log(sol());

 

3. 정리

  • 처음 코드를 작성했을 때는 첫 비교에서 다솜이의 표가 가장 많을 수 있다는 조건을 빼고 작성해서 틀렸었다.
  • 그리고 다시 다솜이의 표가 가장 많은지 확인할 때 기존에 가장 큰 값을 구했던 maxVal값과 비교해서 틀렸었다.
  • 다른 코드를 보니 간단한 코드가 더 많은 듯하다. 아쉽다. 좀 더 쉽게 구현할 수 있도록 생각해봐야겠다.
  • 더 간단하게 작성한 코드