문제

천나라 민호성의 지영 공주님은 매우 아름답다. 공주님 자신도 이 세상 그 누구보다 자신이 아름답다는 것을 알고 있다. 공주님은 자신의 아름다움이 세월의 저편으로 사라지는 것을 매우 두려워한다. 그래서 하루에도 수십 수백 번씩 거울을 보며 자신의 모습이 여전히 아름다운지 확인을 거듭한다. 그러던 어느 날, 세상의 다양한 장면들을 담고 싶었던 공주님의 마법거울은 매일 똑같은 모습만을 비추는 자신의 운명에 좌절하며 앞으로의 운명을 개척하기로 결심했다. 마법거울은 매일 자신의 심리상태에 따라 거울에 비친 공주님의 모습을 좌/우 또는 상/하로 반전시켜 비추기로 한다. 마법거울의 심리상태는 1부터 3까지의 자연수로 표현할 수 있으며, 숫자가 클수록 더 화가 난 상태를 의미한다. 마법거울의 심리상태가 1일 때는 지영 공주님의 모습을 있는 그대로 표현하고, 2일 때는 좌/우로 반전된 모습을, 3일 때는 상/하로 반전된 모습을 표현한다. 정사각형 형태의 마법거울의 크기와 거울에 비친 지영 공주님의 원래 모습, 마법거울의 심리상태가 주어졌을 때, 마법거울에 비친 지영 공주님의 모습을 출력하라.

 

입출력 예시

 

해결

const fs = require('fs');

const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `8
OOOOOOOO
OKKOOEEO
OKKOOEEO
OOOSSOOO
OOOSSOOO
OAOOOOAO
OOAAAAOO
OOOOOOOO
3`
).match(/[^\r\n]+/g);

const s = stdin
const state = Number(s[s.length-1])
let answer = [];

// 1일때 그대로
if (state == 1){
  for (let i=1; i<s.length-1; i++){
    console.log(s[i])
  }

// 2일때 좌우반전
} else if (state == 2){
  for (let i=1; i<s.length-1; i++){
    const letter = s[i].split('')
    for (let j=letter.length-1; j>=0; j--){
      if (j == letter.length-1){
        answer.push([letter[j]])
      } else {
        answer[answer.length-1].push(letter[j])
      }
    }
  }

// 3일때 상하반전
} else {
  for (let i=s.length-2; i>0; i--){
    console.log(s[i])
  }
}

console.log(answer.join('\n').replace(/,/g,''))

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 가뭄(Small)  (0) 2023.03.29
[백준/Node.js] 시간과 날짜  (0) 2023.03.25
[백준/Node.js] 주사위 네개  (0) 2023.03.24
[백준/Node.js] 오늘도 졌다  (0) 2023.03.23
[백준/Node.js] 블랙잭  (0) 2023.03.22

문제

가뭄에 찌든 신촌을 위해서 국렬이는 세 칸으로 구성되어 있는 신촌에 비를 내릴 것이다. 그러나 국렬이는 무능해서 각 칸마다 비를 내리지 못하고, 두 칸에 동일하게 비를 내리는 것만 할 수 있다.

1번째 칸, 2번째 칸에 동시에 뿌리는 비의 강수량을 a cm, 1번째 칸, 3번째 칸에 동시에 뿌리는 비의 강수량을 b cm, 2번째 칸, 3번째 칸에 동시에 뿌리는 비의 강수량을 c cm라고 하자. a, b, c는 모두 양의 실수여야 한다. 가뭄에 찌든 신촌이라도 비가 너무 많이 오면 상당히 곤란하고, 비가 너무 조금 와도 곤란하다. 그래서 각 칸에 해당하는 지역은 강수량이 정확히 di cm가 되어야 한다. 이때 정확한 a, b, c의 값을 구하여라.

 

입출력 예시

 

해결

const fs = require('fs');

const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `5 8 6`
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

const [d1,d2,d3] = input().split(' ').map(Number)

// d1 = a+b, d2 = a+c, d3 = b+c
// d1 + d2 = a+b+a+c 
// d1 + d2 = 2a + d3
// d1 + d2 - d3 = 2a
// d1 + d2 - d3 / 2 = a

const a = (d1 + d2 - d3) / 2
const b = (d1 + d3 - d2) / 2 
const c = (d2 + d3 - d1) / 2


let isSuccess = 1;
if (a <= 0 || b <= 0 || c <= 0){
  isSuccess = -1
}

console.log(isSuccess)
isSuccess > 0 ? console.log(a.toFixed(1),b.toFixed(1),c.toFixed(1)): null;

문제

어느 날 시계를 본 경근이는 시간이 8시 14분인 것을 보고 놀랐다. 왜냐하면 그의 생일은 8월 14일이기 때문이다. 그리고 이 경험을 바탕으로 다음과 같은 문제를 만들었다:

두 정수 x, y가 주어질 때, x y분으로 읽는 것이 가능한지의 여부를 판단하면서, x y일로 읽는 것이 가능한지의 여부를 판단하는 프로그램을 작성하라.

시는 0시에서 23시까지, 분은 0분에서 59분까지가 유효하며, 월은 1월에서 12월까지가 유효하다. 1월, 3월, 5월, 7월, 8월, 10월, 12월은 1일에서 31일까지가 유효하고, 4월, 6월, 9월, 11월은 1일에서 30일까지가 유효하며, 2월은 1일에서 29일까지가 유효하다.

 

입출력 예시

 

해결

const fs = require('fs');

const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `3
8 14
0 29
0 0` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

const s = Number(input())
const days = [31,29,31,30,31,30,31,31,30,31,30,31]
let answer = []

while (true){
  const v = input()
  if (!v) break;
  const [hr, min] = v.split(' ').map(Number)
  
  if ( hr >= 0 && hr <= 23 && min >= 0 && min <= 59){
    if ( hr >= 1 && hr <= 12 && min >= 1 && min <= days[hr-1]){
      answer.push(`Yes Yes`)
    } else {
      answer.push(`Yes No`)
    }
  } else {
    if ( hr >= 1 && hr <= 12 && min >= 1 && min <= days[hr-1]){
      answer.push(`No Yes`)
    } else {
    answer.push(`No No`)
    }
  }
}

console.log(answer.join('\n'))

문제

1에서부터 6까지의 눈을 가진 4개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

  1. 같은 눈이 4개가 나오면 50,000원+(같은 눈)×5,000원의 상금을 받게 된다. 
  2. 같은 눈이 3개만 나오면 10,000원+(3개가 나온 눈)×1,000원의 상금을 받게 된다. 
  3. 같은 눈이 2개씩 두 쌍이 나오는 경우에는 2,000원+(2개가 나온 눈)×500원+(또 다른 2개가 나온 눈)×500원의 상금을 받게 된다.
  4. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다. 
  5. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.  

예를 들어, 4개의 눈이 3, 3, 3, 3으로 주어지면 50,000+3×5,000으로 계산되어 65,000원의 상금을 받게 된다. 4개의 눈이 3, 3, 6, 3으로 주어지면 상금은 10,000+3×1,000으로 계산되어 13,000원을 받게 된다. 또 4개의 눈이 2, 2, 6, 6으로 주어지면 2,000+2×500+6×500으로 계산되어 6,000원을 받게 된다. 4개의 눈이 6, 2, 1, 6으로 주어지면 1,000+6×100으로 계산되어 1,600원을 받게 된다. 4개의 눈이 6, 2, 1, 5로 주어지면 그 중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

N(1 ≤ N ≤ 1,000)명이 주사위 게임에 참여하였을 때, 가장 많은 상금을 받은 사람의 상금을 출력하는 프로그램을 작성하시오.

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `1
3 2 3 2` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();


const s = Number(input())

let i = 0
let sum = 0;

while (i < s) {
  const num = input().split(' ').map(Number).sort((a,b) => a-b)

  num.map((e) => {
    const cnt = num.filter((item) =>  e == item)

    if (cnt.length == 4){
      sum = 50000 + (cnt[0]*5000) > sum ? 50000 + (cnt[0]*5000): sum
    } else if (cnt.length == 3){
      sum = 10000 + (cnt[0]*1000) > sum ? 10000 + (cnt[0]*1000): sum
    } else if (cnt.length == 2){
      if (num[0] == num[1] && num[2] == num[3]){
        sum = 2000 + (num[0]*500) + (num[2]*500) > sum ? 2000 + (num[0]*500) + (num[2]*500) : sum
      } else {
        sum = 1000 + (cnt[0]*100) > sum ? 1000 + (cnt[0]*100) : sum
      }
    } else if (cnt.length == 1){
      const big = Math.max(...num)
      sum = (big*100) > sum ? (big*100): sum 
    }
  })

  i++;
}

console.log(sum)

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 가뭄(Small)  (0) 2023.03.29
[백준/Node.js] 시간과 날짜  (0) 2023.03.25
[백준/Node.js] 오늘도 졌다  (0) 2023.03.23
[백준/Node.js] 블랙잭  (0) 2023.03.22
[백준/Node.js] 직각 삼각형의 두 변  (0) 2023.03.21

문제

프로야구팀 울림 제미니스는 오늘도 졌다. 이번에는 스타트링크 걸리버스의 4번타자가 끝내기 홈런을 쳐서 졌다. 울림 제미니스의 열렬한 팬인 지수는 속으로 화를 참으며 어떤 선수 때문에 졌는지 생각해보았다. 지수는 팀이 역전패를 했다면 불펜 투수의 책임이고, 그렇지 않다면 타자와 선발 투수의 책임이라고 생각했다.

지수는 오늘 경기에서 울림이 어떻게 졌는지 생각해보려 했지만, 기분이 너무 더러워서 뭘 할 의욕이 나지 않았다. 지수를 도와 오늘 경기에서 울림 제미니스가 역전패를 했는지 구하는 프로그램을 작성하여라. 역전패가 성립하려면 경기 도중 울림 제미니스가 이기고 있는 순간이 있어야 한다.

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 2` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

const j = input().split(' ').map(Number)
const s = input().split(' ').map(Number)

let jTeam = 0;
let sTeam = 0;
let flag = false; // 경기에서 승리하다가 지는 것 보여주기

let i = 0
while (i < j.length) {
  jTeam += j[i]
    
  if (jTeam > sTeam) {
    flag = true;
  }
  sTeam += s[i]

  i++
}

jTeam < sTeam && flag == true ? console.log('Yes') : console.log('No')

 

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 시간과 날짜  (0) 2023.03.25
[백준/Node.js] 주사위 네개  (0) 2023.03.24
[백준/Node.js] 블랙잭  (0) 2023.03.22
[백준/Node.js] 직각 삼각형의 두 변  (0) 2023.03.21
[백준/Node.js] 팬그램  (0) 2023.03.20

문제

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

 

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `10 500
93 181 245 214 315 36 185 138 216 295` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

const [total, limit] = input().split(' ').map(Number)
const card = input().split(' ').map(Number)

let sum = 0; 

for (let i=0; i<total; i++){
  if (limit < card[i]) continue
  
  for (let j=i+1; j<total; j++){
   if (limit < card[i] + card[j]) continue
    
    for (let z=j+1; z<total; z++){
      if (limit < card[i] + card[j] + card[z]) continue

      if (sum < card[i] + card[j] + card[z]){
        sum = card[i] + card[j] + card[z]
      }
    }
  }
}

console.log(sum)

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 주사위 네개  (0) 2023.03.24
[백준/Node.js] 오늘도 졌다  (0) 2023.03.23
[백준/Node.js] 직각 삼각형의 두 변  (0) 2023.03.21
[백준/Node.js] 팬그램  (0) 2023.03.20
[백준/Node.js] 탄산 음료  (0) 2023.03.17

문제

컴퓨터를 이용하면 수학 계산이 조금 쉬워진다. 다음과 같은 예를 살펴보자. 세 변의 길이가 a, b, c(c는 빗변)이면서 a2+b2=c2를 만족하는 삼각형을 직각삼각형이라고 한다. 이 공식은 피타고라스의 법칙이라고 한다.

직각 삼각형의 두 변의 길이가 주어졌을 때, 한 변의 길이를 구하는 프로그램을 작성하시오.

 

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `6 -1 6
3 4 -1
-1 2 7
5 -1 3
0 0 0` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

let i = 1;
let answer=[];

while (true) {
  const s = input().split(' ').map(Number)

  if (s[0] === 0) break;

  const area = s.indexOf(-1)
  const arr = ['a','b','c']

  if (arr[area] == 'a') {
    const sq = (s[2]**2) - (s[1]**2)
    const line = (Math.sqrt(sq)).toFixed(3)
    
    if (line < s[2]  && line != 0){
      answer.push(`Triangle #${i}\n${arr[area]} = ${line}`)
    } else {
      answer.push(`Triangle #${i}\nImpossible.`)
    } 
  }

  if (arr[area] == 'b') {
    const sq = (s[2]**2) - (s[0]**2)
    const line = (Math.sqrt(sq)).toFixed(3)
    
    if (line < s[2] && line != 0){
      answer.push(`Triangle #${i}\n${arr[area]} = ${line}`)
    } else {
      answer.push(`Triangle #${i}\nImpossible.`)
    } 
  }

  if (arr[area] == 'c') {
    const sq = (s[0]**2) + (s[1]**2)
    const line = (Math.sqrt(sq)).toFixed(3)
    
    if (line > s[2] && line != 0){
      answer.push(`Triangle #${i}\n${arr[area]} = ${line}`)
    } else {
      answer.push(`Triangle #${i}\nImpossible.`)
    } 
  }

  i++;
}

console.log(answer.join('\n\n'))

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 오늘도 졌다  (0) 2023.03.23
[백준/Node.js] 블랙잭  (0) 2023.03.22
[백준/Node.js] 팬그램  (0) 2023.03.20
[백준/Node.js] 탄산 음료  (0) 2023.03.17
[백준/Node.js] 팰린드롬수  (0) 2023.03.16

문제

팬그램은 알파벳의 모든 글자들을 사용해서 만든 문장이다. "the quick brown fox jumps over a lazy dog"과 "jackdaws loves my big sphinx of quartz"은 팬그램이다. 문장이 주어졌을 때, 팬그램인지 아닌지를 알아내는 프로그램을 작성하시오.

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `jackdawf loves my big quartz sphinx
abcdefghijklmnopqrstuvwxyz
hello world
*` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();


let answer = [];

while (true) {
  const str = input().replace(/ /g,'').split('')
  if (str == '*') break;

  let temp = [];
  str.map((e) => {
    if (!temp.includes(e)){
      temp.push(e)    
    } 
 
  })
  
  const result = temp.length == 26? 'Y' : 'N'
  answer.push(result)
}

console.log(answer.join('\n'))

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 블랙잭  (0) 2023.03.22
[백준/Node.js] 직각 삼각형의 두 변  (0) 2023.03.21
[백준/Node.js] 탄산 음료  (0) 2023.03.17
[백준/Node.js] 팰린드롬수  (0) 2023.03.16
[백준/Node.js] 약수  (0) 2023.03.15

문제

준민이는 탄산 음료를 좋아한다. 탄산 음료를 사느라 돈을 다 써버렸기 때문에, 이제 준민이는 가진 돈이 없어 탄산 음료를 사먹을 수 없다.

준민이는 항상 법을 지키며 사는 사람이기 때문에, 아무리 탄산 음료가 먹고 싶어도 훔치지 않는다. 따라서, 법적으로 문제가 없는 방법으로 탄산 음료를 구매할 것이다.

마침 빈 병을 특정 개수만큼 가져가면, 새 병으로 바꾸어주는 이벤트가 진행중이다. 준민이는 길에서 빈 병을 열심히 찾은 뒤, 탄산 음료를 먹으려고 한다.

준민이가 현재 가지고 있는 빈 병의 수와 길에서 발견한 빈 병의 수, 새 병으로 바꾸는데 필요한 빈 병의 수가 주어졌을 때, 준민이가 탄산 음료를 몇 개 먹을 수 있는지 구하는 프로그램을 작성하시오.

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `5 5 2` 
).match(/[^\r\n]+/g);

const input = (() => {
let line = 0;
  return () => stdin[line++];
})();

let s = input().split(' ').map(Number)

let hav = s[0]+s[1]
let chg = 0;
let i=0;
while (true) {
  if (hav < s[2]) break;

  const toChg = Math.floor(hav/s[2])
  const left = hav%s[2]
  chg+=toChg
  hav =toChg+left
  i++;
}

console.log(chg)

문제

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다.

수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬수다. 121, 12421 등은 팰린드롬수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.

 

입출력 예시

 

해결

const fs = require('fs');
const { start } = require('repl');
const stdin = (process.platform === 'linux'
    ? fs.readFileSync('/dev/stdin').toString()
    : `121
1231
12421
0` 
).match(/[^\r\n]+/g);

let s = stdin
let i = 0;
let answer = []
while (true) {
  if (Number(s[i]) === 0) {
    break;
  }
  const v = s[i].split('')
  let result = 'yes'
  for (let j=0; j < Math.floor(v.length/2); j++ ){

    if (v[j] != v[v.length-1-j]){
      result = 'no'
      break;
    }
  }
  answer.push(result)
  i++;
}
console.log(answer.join('\n'))

'개발 공부 > Algorithm' 카테고리의 다른 글

[백준/Node.js] 팬그램  (0) 2023.03.20
[백준/Node.js] 탄산 음료  (0) 2023.03.17
[백준/Node.js] 약수  (0) 2023.03.15
[백준/Node.js] 최대공약수와 최소공배수  (0) 2023.03.14
[백준/node.js] 그릇  (0) 2023.03.11

+ Recent posts