Published on

2845, 2914, 3003, 3046

파티가 끝나고 난 뒤 (2845번)

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
let refValue = 0
let result = []
const input1 = input[0]
  .split(' ')
  .reduce((acc, cur) => (acc !== 0 ? (refValue = acc * cur) : (refValue = cur)))
const input2 = input[1].split(' ').map((j) => result.push(+j - refValue))
console.log(result.toString().split(',').join(' '))

문제

파티가 끝나고 나면, 사람들은 누가 파티에 왔는지와 얼마나 많은 사람들이 왔는지를 궁금해한다. 보통 파티는 매우 크게 열리기 때문에, 정확하게 몇 명이 참가했는지 알 수가 없다.

지난주 토요일에 상근이는 자신의 3학년 진학을 기념하면서 매우 성대한 파티를 열었다. 그리고, 상근이는 1m2당 몇 명의 사람이 있었는지 알고있다.

상근이의 파티는 정말 엄청난 규모였기 때문에, 대부분의 신문에도 기사가 실렸다. 상근이는 서로 다른 5개의 신문을 보면서 그 기사에 적혀져있는 참가자의 수를 적었다.

상근이는 자신이 알고있는 참가자의 수가 정확하다고 생각한다. 각 신문 기사에 실려있는 참가자의 수가 몇 명 만큼 잘못되어있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 1m2당 사람의 수 L (1 ≤ L ≤ 10)과 파티가 열렸던 곳의 넓이 P (1 ≤ P ≤ 1000)가 주어진다.

둘째 줄에는 각 기사에 실려있는 참가자의 수가 주어진다. 106보다 작은 양의 정수 5개가 주어진다.

출력

출력은 첫째 줄에 다섯 개의 숫자를 출력해야 한다. 이 숫자는 상근이가 계산한 참가자의 수와 각 기사에 적혀있는 참가자의 수의 차이이다.

효율성 따지지 않고 의식의 흐름대로 만들었다. 때문에 많이 지저분하다.

우선 입력값이 두줄이어서 이 부분부터 처리하고 시작하기로 했다. 그 다음 스텝으로 첫줄 두 숫자를 곱할 필요가 있었다. (상근이가 1제곱미터당 사람 수는 정확히 알고 있으니 두 값을 곱하면 전체 에어리어에 있는 사람 수가 나올 것이라는 생각)

그래서 refValue라는 변수에 두 값의 곱을 넣었다.

그 다음 refValue와 두번째 줄의 값들을 순서대로 차를 구해 출력해주었다.

여기까진 내 풀이 방법이었고, 이 코드를 조금 다른 방식으로 정리하기 위해 다른 분들의 풀이를 보다가 어떤 분이 구조분해할당을 이용한 풀이를 하신걸 보고 조금 바꿔봤다. (변수명들만..)

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n')
const solution = (args) => {
  let result = []
  const [capacity, area] = input[0].split(' ').map(Number)
  const refValue = capacity * area
  const participate = input[1].split(' ').map(Number)
  participate.map((participant) => {
    return result.push(participant - refValue)
  })
  return result.join(' ')
}
console.log(solution(input))

코드가 조금 길어지긴 했지만 의문의 reduce+if문보다 명확하고 깔끔하게 표현된 것 같다. 그리고 저 두 코드는 대략 60Byte밖에 차이 안나고 처리속도는 오히려 나중에 쓴게 빠르다..

코드 줄이 적다고 빠른 것도 아니고 지저분하게 쓴다고 빨라지는 것도 아니니 조금 더 정성들여서 코드를 작성할 필요가 있겠다는 생각을 했다.


저작권 (2914번)

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split(' ').map(Number)
console.log(input[0] * (input[1] - 1) + 1)

문제

창영이는 노래 여러 개를 이어서 부르는 가수이다. 유명한 노래의 비슷한 멜로디를 이어서 부르면서 언제 곡이 넘어갔는지 모르게 만드는 것이 창영이 노래의 특징이다. 이런 노래로 상업적으로 엄청난 성공을 거둔 창영이에게 큰 시련이 찾아왔다. 그것은 바로 저작권이었다.

창영이의 노래에 포함되어 있는 멜로디는 모두 저작권이 다른 사람에게 있는 노래이다. 따라서, 이 음악으로 상업적인 활동을 했기 때문에, 저작권 협회에 저작권료를 내야한다.

창영이는 자신의 앨범에 포함되어있는 저작권이 있는 멜로디의 평균값을 구해보기로 했다. 이 값은 아래와 같이 구할 수 있다.

(창영이 앨범에 수록된 곡에 포함되어 있는 저작권이 있는 멜로디의 개수) / (앨범에 수록된 곡의 개수)

이때, 평균값은 항상 올림을 해서 정수로 만들어야 한다. 예를 들어, 창영이의 1집 앨범 "영창에서 영원히 영창피아노를 친다"에 총 38개 곡이 수록되어 있고, 이 앨범에 저작권이 있는 멜로디가 894개가 있다면, 평균값은 23.53이 되고 올림해서 24가 된다.

매니저 강산이는 얼마나 많은 사람에게 저작권료를 주어야 하는지 궁금해졌다. 강산이가 알고 있는 정보는 앨범에 수록되어 있는 곡의 개수와 위에서 구한 평균값이다. 이때, 적어도 몇 곡이 저작권이 있는 멜로디인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 앨범에 수록된 곡의 개수 A와 평균값 I가 주어진다. (1 ≤ A, I ≤ 100)

출력

첫째 줄에 적어도 몇 곡이 저작권이 있는 멜로디인지 출력한다.

수능 비문학 같은 문제다. 계산할 양에 비해 지문이 유독 길고 함정카드가 많은 문제.

적어도 몇 곡이 저작권 걸린 멜로디인지 확인하기 위해 갖고 있는 값은 '곡의 개수'와 '평균값'

바꿔말하면

( 곡의 갯수 * ( 평균값 - 1 )) + 1

을 하면 답이 나온다는 뜻이다.


킹, 퀸, 룩, 비숍, 나이트, 폰 (3003번)

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split(' ').map(Number)
console.log(1 - input[0], 1 - input[1], 2 - input[2], 2 - input[3], 2 - input[4], 8 - input[5])

문제

동혁이는 오래된 창고를 뒤지다가 낡은 체스판과 피스를 발견했다.

체스판의 먼지를 털어내고 걸레로 닦으니 그럭저럭 쓸만한 체스판이 되었다. 하지만, 검정색 피스는 모두 있었으나, 흰색 피스는 개수가 올바르지 않았다.

체스는 총 16개의 피스를 사용하며, 킹 1개, 퀸 1개, 룩 2개, 비숍 2개, 나이트 2개, 폰 8개로 구성되어 있다.

동혁이가 발견한 흰색 피스의 개수가 주어졌을 때, 몇 개를 더하거나 빼야 올바른 세트가 되는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 동혁이가 찾은 흰색 킹, 퀸, 룩, 비숍, 나이트, 폰의 개수가 주어진다. 이 값은 0보다 크거나 같고 10보다 작거나 같은 정수이다.

출력

첫째 줄에 입력에서 주어진 순서대로 몇 개의 피스를 더하거나 빼야 되는지를 출력한다. 만약 수가 양수라면 동혁이는 그 개수 만큼 피스를 더해야 하는 것이고, 음수라면 제거해야 하는 것이다.

위에 답이라고 넣은건 다시 쓰지도 못하고 그냥 맞춤형이라 솔직히 코테하는 의미가 없는 것 같고..

const result = []
piece.map((v, i) => result.push(v - input[i]))
console.log(result.join(' '))

빈 배열에 map 루프 돈 값들을 다시 집어넣어주면 숫자가 많아져도 다시 쓸 수는 있어진다. 근데 이게 더 느리고 코드도 길어서..


R2 (3046번)

const input = require('fs').readFileSync('/dev/stdin').toString().trim().split(' ')
console.log(input[1] * 2 - input[0])

문제

두 숫자 R1과 R2가 있을 때, 두 수의 평균 S는 (R1+R2)/2와 같다. 상근이는 정인이 생일 선물로 두 숫자 R1과 R2를 주려고 한다. 생일 파티에서 상근이는 정인이에게 이 두 숫자를 말해주고, 정인이는 이 숫자를 받아 적는다. 그리고 나서 기쁜 마음으로 1년동안 이 숫자를 외우면서 산다.

상근이는 R1과 R2를 엄청난 고민 끝에 정했다. 작년에는 R1과 R2를 까먹어서 아무 숫자나 정해서 주었기 때문에, 올해는 까먹지 않기 위해서 평균 S도 같이 기억하려고 한다.

오늘은 정인이 생일이다. 5분 후에 상근이는 생일 선물로 두 숫자 R1과 R2를 말해주어야 하지만, 안타깝게도 R2를 까먹고 말았다. 하지만 R1과 S는 기억하고 있다!

상근이를 도와 R2가 몇 인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 두 정수 R1과 S가 주어진다. 두 수는 -1000보다 크거나 같고, 1000보다 작거나 같다.

출력

첫째 줄에 R2를 출력한다.

상근이 나쁜놈.. 아무리 그래도 생일선물로 숫자 두개라니..