코딩연습
[백준 알고리즘] 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