코딩연습

[백준 알고리즘] Node.js 1813. 논리학 교수

니 뽀 2023. 3. 20. 15:20

1. 문제

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

 

1813번: 논리학 교수

첫째 줄에 항승이가 한 말의 개수 N이 주어진다. N은 1보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄에 항승이가 칠판에 작성한 내용에 있는 정수가 주어진다. 이 정수는 50보다 작거

www.acmicpc.net

 

2. 풀이

- 문제를 보면

  • 정확하게 a개의 말은 참이다.
  • 정확하게 b개의 말은 참이다.
  • 정확하게 c개의 말은 참이다.

라는 표현이 있는데, 예제 입력을 통하여 자세하게 알 수 있었다. 

' 입력 4 / 0 1 2 3, 출력 1 ' 이라는 값은 

0의 값은 0 개, 1의 값은 1개, 2의 값은 2개, 3의 값은 3개 가 있어야 한다는 의미이다.

0의 값이 입력될 경우 항상 모순이 발생하기 때문에 -1이 되고

나머지 숫자에 대해서는 입력 값과 비교하여 몇개가 참이 되는지를 확인하면 된다.

 

다른 예제에서 '입력 6 / 0 3 1 3 2 3, 출력 3' 은

1의 값은 1개가 있으므로 참이 되므로 1,

2의 값은 1개가 있으므로 거짓이기 때문에 0,

3의 값은 3개가 있으므로 참이기 때문에 3

이 되는 방식이다.

const inputs = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');

const n = +inputs.shift();

let numbers = inputs[0].split(' ').map(Number);
let result = 0;
for(let i = 0; i < n; i++){
    if(numbers[i] === 0) result = -1;
    else {
        let checkNum = numbers.filter(item => item === numbers[i]).length;
        
        if(checkNum === numbers[i] && result < numbers[i]) result = numbers[i]
    }
}

console.log(result)

 

3. 정리

- 문제 해석을 하는데 오래걸렸다.

- 배열에서 같은 값을 찾는 방법에는 filter() 메서드 이외에도 반복문, reduce() 메서드가 있다.

1) filter() 이용

let inputs = [0,1,1,2,3]

let result = 0;

result = inputs.filter(item => item === 1)
console.log(result, result.length) // [1,1] 2

2) reduce() 이용

let inputs = [0,1,1,2,3]

let result = 0;

result = inputs.reduce((cnt, element) => cnt + (element === 1), 0);
console.log(result) // 2

3) for() 이용

let inputs = [0,1,1,2,3]

let result = 0;
for(let i = 0; i < inputs.length; i++){
    if(inputs[i] === 1) result++;
}
console.log(result) // 2