본문 바로가기
Algorithm/Baekjoon

테스트 케이스의 개수를 입력받는 유형

by minhi 2024. 10. 6.

반복문 유형에서는 반복 횟수와 관련이 있는 테스트 케이스의 개수를 입력받는 유형이 꽤 있었다.

 

기존 유형에서는 아래와 같이 예제 입력을 받아

let input = require('fs').readFileSync('/dev/stdin').toString().split('\n')

 

첫번째 예제 입력은 input[0], 두번째 예제 입력은 input[1], ...과 같이 처리하였으나

 

테스트 케이스의 개수를 입력받는 유형에서는 input[0]이 테스트 케이스가 되므로 예제 입력을 처리하는 방법도 달라진다.

 

원래는 예제 입력을 input[1], input[2], ...부터 처리하는 방식으로 풀이하였다.

 

백준 10950번

let input = require('fs').readFileSync('/dev/stdin').toString().split('\n')

const T = Number(input[0])

for (let i = 1; i <= T; i++) {
  const numbers = input[i].split(' ').map(Number)
  console.log(numbers[0]+numbers[1])
}

 

백준 15552번

let input = require('fs').readFileSync('/dev/stdin').toString().split('\n')

const T = Number(input[0])

let output = ''

for(let i = 1; i <= T; i++) {
  const [a, b] = input[i].split(' ').map(Number)
  i !== T ? output += `${a+b}\n` : output +=`${a+b}`
}

console.log(output)

 

백준 25304번

let input = require('fs').readFileSync('/dev/stdin').toString().split('\n')

const X = Number(input[0])
const N = Number(input[1])

let total = 0

for (let i = 2; i < 2 + N; i++) {
  const [price, quantity] = input[i].split(' ').map(Number)
  total += price * quantity
}

total === X ? console.log('Yes') : console.log('No')

 

그러나 나머지 매개변수를 사용하면 테스트 케이스의 개수 입력 여부와 상관없이

 

동일한 방법으로 예제 입력을 처리할 수 있게 된다.

 

백준 10950번

let [T, ...input] = require('fs').readFileSync('/dev/stdin').toString().split('\n')

for (let i = 0; i < T; i++) {
  const numbers = input[i].split(' ').map(Number)
  console.log(numbers[0]+numbers[1])
}

 

백준 15552번

let [T, ...input] = require('fs').readFileSync('/dev/stdin').toString().split('\n')

let output = ''

input.forEach((value, index) => {
  const [a, b] = value.split(' ').map(Number)
  index !== T-1 ? output += `${a+b}\n` : output +=`${a+b}`
})

console.log(output)

 

* 다른 문제에서도 forEach 메소드 이용해서 많이 풀어보려고 하는데 자꾸 틀렸다고 한다. 하지만 왜 틀렸다는 건지는 모르겠다.

더보기
더보기
index !== T-1 ? output += `${a+b}\n` : output +=`${a+b}`

 

위 부분은 마지막 출력에서 \n를 생략하기 위한 것으로, 다음과 같은 풀이로 더 간략하게 처리할 수 있다.

let input = require('fs').readFileSync('/dev/stdin').toString().split('\n')

const T = Number(input[0])

let output = ''

for (let i = 1; i <= T; i++) {
  const [a, b] = input[i].split(' ').map(Number)
  output += `${a+b}\n`
}

console.log(output.trim())

 

백준 25304번

let [X, N, ...input] = require('fs').readFileSync('/dev/stdin').toString().split('\n')

X = Number(X)
N = Number(N)

let total = 0

for (let i = 0; i < N; i++) {
  total += input[i].split(' ').map(Number)[0] * input[i].split(' ').map(Number)[1]
}

total === X ? console.log('Yes') : console.log('No')

 

개인적으로는 나머지 매개변수를 사용했을 때가 실제 예제 입력들을 처리하기에는 더 쉬웠는데

 

실행 속도에 있어서는 기존 풀이 방법이 더 나은 것 같기도 하다.

 

참고) 함수 ① 함수 기본

 

💫 이 문제를 통해 배운 것

테스트 케이스의 개수를 입력받는 유형에서는 나머지 매개변수를 이용하여 실제 예제 입력들로만 이루어진 배열을 입력받을 수 있다.

'Algorithm > Baekjoon' 카테고리의 다른 글

백준 10871번  (3) 2024.10.09
백준 10952번  (0) 2024.10.07
백준 25314번  (0) 2024.10.05
백준 8393번  (2) 2024.10.04
백준 10950번  (0) 2024.10.04