문제

자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

 

 

출력

첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

 

 

풀이

입력값을 숫자로 변환해준 다음 입력값에서 1까지 for문이 순회되는 조건을 걸어주고

각각을 result 배열에 push로 넣어준 다음

최종적으로 join('\')을 통해 원하는 형태로 출력해준다.

 

이번 문제는 조건이 10만까지 올라가기 때문에

console.log()로 처리할 경우 시간초과가 나오기 때문에

문자열에 \n을 추가해 하나의 큰 문자열 덩어리로 만들던지

배열에 담은 다음 최종적으로 합치는 등의 가공이 필요했다.

const input = Number(require('fs').readFileSync('/dev/stdin').toString().trim())
const result = []
for(let i = input ; i > 0 ; i--){
    result.push(i)
}
console.log(result.join('\n'))
const input = Number(`20`)
const result = []
for(let i = input ; i > 0 ; i--){
    result.push(i)
}
console.log(result.join('\n'))

'알고리즘 > 백준' 카테고리의 다른 글

[백준 JS] 3046번 R2  (0) 2023.03.09
[백준 JS] 2845번 파티가 끝나고 난 뒤  (0) 2023.03.09
[백준 JS] 2480번 주사위 세개  (0) 2023.03.09
[백준 JS] 2440번 별 찍기 - 3  (0) 2023.03.09
[백준 JS] 2439번 별 찍기 - 2  (0) 2023.03.09

문제

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

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

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

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

 

 

입력

첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다. 

 

 

출력

첫째 줄에 게임의 상금을 출력 한다.

 

 

풀이

조건은 간단한데 3개가 일치할 경우, 2개가 일치할 경우, 모두 다를 경우 3가지의 조건에 따라 결과가 달라진다.

같은 눈이 세개일 경우 모든 주사위의 값이 동일하기 때문에 10000 + a * 1000으로 처리할 수 있으며

두 개의 값이 같은 경우는 세 가지 경우가 존재하는데 3개 중 두개가 동일하다는 것은

(a,a,b), (a,b,a), (b,a,a)처럼 한 포인트에서 일치하는 일이 두번 일어난다는 의미기도 하다.

그렇기 때문에 하나의 위치를 고정해서 a === b, b === c로 체크할 경우 a === c만 따로 체크하면

b가 공통적으로 들어가는 값은 1000 + b * 100으로 처리할 수 있고 

나머지 경우는 a 또는 c * 100을 더하면 된다.

 

마지막의 경우는 else들의 최종 종착지의 값으로 a, b, c 중 가장 큰 값에 100을 곱하는 것이기 때문에

Math.max로 최대값을 구한 다음 100을 곱해 미리 result에 배정해서 처리했다.

const [a, b, c] = require('fs').readFileSync('/dev/stdin').toString().trim().split(" ").map(Number)
let result = Math.max(a,b,c)*100

if(a===b && b===c){
    result = 10000 + a * 1000
}
else if(a===b || b===c){
    result = 1000 + b * 100
}
else if(a===c){
    result = 1000 + a * 100
}
console.log(result)
const [a, b, c] = `3 3 6`.split(" ").map(Number)
let result = Math.max(a,b,c)*100

if(a===b && b===c){
    result = 10000 + a * 1000
}
else if(a===b || b===c){
    result = 1000 + b * 100
}
else if(a===c){
    result = 1000 + a * 100
}
console.log(result)

문제

첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제

 

 

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

 

 

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 

 

풀이

이전의 별 찍기 - 2와는 다르게 별을 많은 순서대로 출력하는 문제로

별의 갯수인 input값부터 진행해 0보다 클 때 까지 진행하면 되는 문제로

별을 우측정렬하지 않고 좌측정렬한 모습으로 출력되기 때문에 공백은 굳이 넣을 필요가 없다.

 

for문을 순회할 때는 i++만 존재하는 것이 아니라 i--, i+=2, i*=2 등 조건에 따라 뭐든 들어갈 수 있기 때문에

생각하는 방식에 따라 여러가지 시도가 가능하다.

const input = Number(require('fs').readFileSync('/dev/stdin').toString().trim())

for(let i = input ; i > 0 ; i--){
    console.log('*'.repeat(i))
}
const input = Number(`5`)

for(let i = input ; i > 0 ; i--){
    console.log('*'.repeat(i))
}

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

 

 

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

 

 

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 

 

풀이

문제의 규칙을 잘 보면 별의 갯수는 1~n까지로 늘어나지만

공백과 별의 갯수의 합은 최종적으로 출력되는 별의 갯수와 같기 때문에

공백의 갯수는 N - 현재 별의 갯수라고 볼 수 있다.

 

같은 문자열의 반복은 repeat()을 사용해서 처리할 수 있기 때문에

백틱 또는 문자열의 합을 통해 해결할 수 있으며

하나의 방식을 일관되게 사용하는 편이 통일성이 있기 때문에 백틱을 사용했다.

const input = Number(require('fs').readFileSync('/dev/stdin').toString().trim())
for(let i = 1 ; i <= input ; i++){
    console.log(`${' '.repeat(input-i)}${'*'.repeat(i)}`)
}
const input = Number(`5`)
    for(let i = 1 ; i <= input ; i++){
    console.log(`${' '.repeat(input-i)}${'*'.repeat(i)}`)
}

 

문제

영문 문장을 입력받아 모음의 개수를 세는 프로그램을 작성하시오. 모음은 'a', 'e', 'i', 'o', 'u'이며 대문자 또는 소문자이다.

 

 

입력

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 영어 대소문자, ',', '.', '!', '?', 공백으로 이루어진 문장이 주어진다. 각 줄은 최대 255글자로 이루어져 있다.

입력의 끝에는 한 줄에 '#' 한 글자만이 주어진다.

 

 

출력

각 줄마다 모음의 개수를 세서 출력한다.

 

 

풀이

문제의 접근 방식은 여러가지가 있는데 

일단 모음 판별에 대해서 이야기하자면

a, e, i, o, u를 if문을 통해 조회해서 처리할 수 있고

또는 배열 내부에 넣은 다음 arr.includes(str) 형태로 각각의 문자열을 직접 조회해볼 수도 있다.

 

문자열이 적어 시간복잡도면에서 크게 손실이 나지는 않지만

includes를 사용하기보다는 객체로 넣어 해당 글자를 바로 조회할 수 있게 만들었으며

각각의 문자열 내부에 모음이 있을 경우 count를 추가하고

하나의 문자열의 조회가 끝난 경우 count를 result에 넣어준 다음

최종적으로 result.join('\n')을 통해 요구하는 형태로 출력했다.

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

const vowel = {a : 1, e : 1, i : 1, o : 1, u : 1}
const result = []

for(let i = 0 ; i < input.length - 1 ; i++){
    let count = 0;
    for(let j = 0 ; j < input[i].length ; j++){
        if(vowel[input[i][j].toLowerCase()]){
            count += 1
        }
    }
    result.push(count)
}

console.log(result.join('\n'))
const input = `How are you today?
Quite well, thank you, how about yourself?
I live at number twenty four.
#`.split('\n')
const vowel = {a : 1, e : 1, i : 1, o : 1, u : 1}
for(let i = 0 ; i < input.length - 1 ; i++){
    let num = 0;
    for(let j = 0 ; j < input[i].length ; j++){
        if(vowel[input[i][j].toLowerCase()]){
            num += 1
        }
    }
    console.log(num)
}

문제

대회 참가자는 되도록 일찍 대회의 모든 문제를 한 번씩 읽어 보는 것이 권장됩니다. 이렇게 하면 대회의 전체적인 분위기를 느낄 수 있고, 종종 비교적 쉬운 문제를 빨리 발견해서 속도에서 우위를 점할 수도 있습니다.

하지만 실제 참가자들은 다양한 전략을 사용하고, 문제들이 배치된 순서에 따라서 일부 문제를 아예 읽지 못하거나 아주 늦은 시점에 읽어 보게 될 수도 있습니다. 몇몇 대회는 이를 이용해서 각 문제가 적절한 관심을 받을 수 있도록 문제 순서를 전략적으로 정하기도 합니다.

다음은 흔히 사용되는 몇 가지 문제 배치 방식입니다.

  • 출제진이 예상하는 난이도 순으로 배치합니다. 문제의 난이도에 따라 다른 점수를 주는 대회에서 자주 쓰는 방식이며, 그렇지 않은 대회에서 이 방식을 사용하는 경우는 보통 예상 난이도 순으로 문제가 배정되었다는 공지가 이루어집니다.
  • 문제 이름 순으로 정렬합니다. 이 방식은 문제 순서가 난이도와 관련 없음을 직접적으로 보여 줄 수 있으나, 가끔 이를 역으로 이용해 문제 이름을 문제 번호에 맞춰서 짓는 경우도 있습니다.
  • 완전 무작위로 배치합니다.
  • 문제 몇 개의 위치를 고정하고, 나머지를 무작위로 배치합니다. 이 경우 주로 쉬운 문제를 앞쪽에, 어려운 문제를 뒤쪽에 놓습니다.

UCPC 예선은 가장 마지막 방법을 따라, 가장 쉬운 문제의 위치를 고정하고 나머지를 무작위로 배치하는 방법을 사용해 왔습니다. 다음은 지금까지 UCPC 예선에서 출제진이 의도한 가장 쉬운 문제의 번호와 문제 제목입니다.

  • UCPC 2018 예선: A번, 수학은 체육과목 입니다
  • UCPC 2019 예선: A번, 수학은 체육과목 입니다 2
  • UCPC 2020 예선: A번, 수학은 비대면강의입니다
  • UCPC 2021 예선: A번, 수학은 체육과목 입니다 3

이를 바탕으로, 각 연도별로 출제진이 의도한 가장 쉬운 문제의 번호를 출력하는 프로그램을 작성해 봅시다.

 

 

입력

첫 줄에 UCPC 개최 연도 y가 주어집니다. (2018≤ y ≤2022)

 

 

출력

y년도 UCPC 예선의 출제진이 의도한 가장 쉬운 문제의 번호를 영어 대문자 알파벳 한 글자로 출력하세요.

 

 

풀이

 

문제 설명은 중구난방이지만 결론적으로 보면 가장 쉬운 문제의 위치를 고정한다고 되어 있고

기존 18~21년도 쉬운 문제도 A번이기 때문에 입력에 관계없이 A를 출력하면 되는 문제였다.

console.log("A")

문제

아래 예제와 같이 새싹을 출력하시오.

 

 

입력

입력은 없다.

 

 

출력

새싹을 출력한다.

 

 

풀이

이전에도 언급헀지만 문자열을 출력할 때 백틱에 사용하는 기호 (`)와 백슬래시 (\)를 표기하기 위해서는
앞에 백슬래시를 하나 붙여줘야 한다.
 
그렇기 때문에 백틱기호는 (\`)로 표기해야 하고 
백슬래시는 (\\)로 표기해야 정상적으로 출력되는 것을 볼 수 있다.
 
출력 예제를 그대로 복사한 다음 백틱기호 및 백슬래시 앞에 백슬래시를 붙여 출력하자
console.log(`         ,r'"7
r\`-_   ,'  ,/
 \\. ". L_r'
   \`~\\/
      |
      |`)

문제

ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다.

불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.

 

 

입력

서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)

 

 

출력

불기 연도를 서기 연도로 변환한 결과를 출력한다.

 

 

풀이

불기 연도는 전혀 모르고 있었지만 문제 제목에서 힌트를 얻을 수 있다.

1998년생이 2541년생이라는 말은 현재 년도에서 543이 추가되었다는 말이고

불기 연도를 현재 연도로 바꾸려면 주어진 값에서 543을 빼면 된다는 것을 알 수 있다.

 

백준은 입력값이 멋대로 들어오는 가능성이 많기 때문에 .trim()을 붙이는 것을 습관화 하고

문자열로 값을 받아왔기 때문에 다시 number type으로 변환하기 위해 Number()로 감싸준 다음

해당 값에서 543을 빼서 해결할 수 있다.

const input = Number(require('fs').readFileSync('/dev/stdin').toString().trim())
console.log(input-543)
const input = Number(`2566`)
console.log(input-543)

 

문제

흔한 수학 문제 중 하나는 주어진 점이 어느 사분면에 속하는지 알아내는 것이다. 사분면은 아래 그림처럼 1부터 4까지 번호를 갖는다. "Quadrant n"은 "제n사분면"이라는 뜻이다.

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

예를 들어, 좌표가 (12, 5)인 점 A는 x좌표와 y좌표가 모두 양수이므로 제1사분면에 속한다. 점 B는 x좌표가 음수이고 y좌표가 양수이므로 제2사분면에 속한다.

점의 좌표를 입력받아 그 점이 어느 사분면에 속하는지 알아내는 프로그램을 작성하시오. 단, x좌표와 y좌표는 모두 양수나 음수라고 가정한다.

 

 

입력

첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)

 

 

출력

점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다.

 

 

출력

x와 y의 좌표 모두 0이 아니기 때문에 각각은 모두 음수 또는 양수라는 조건을 가지고 있다.

각각의 조건을 (+,+), (+,-), (-,-), (-,+)로 1, 2, 3, 4 사분면으로 구분할 수 있다.

 

입력값을 받기 위해 split('\')으로 분할한 다음 map(Number)로 x, y값을 구조분해할당으로 받아주고

if, if else의 조건문을 통해 1~4사분면을 구분해 출력한다.

 

각각 출력을 진행할 경우 이해하기 복잡할 수 있다고 생각해

result에 값을 저장하고 최종적으로 출력하게 진행했으며

마지막 else 부분의 값을 먼저 할당해 마지막 예외 부분을 미리 처리했다.

const [a, b] = require('fs').readFileSync(0).toString().split('\n').map(Number)

let result = 3
if(a>0 && b>0){
    result = 1
}
else if(a>0 && b<0){
    result = 4
}
else if(a<0 && b>0){
    result = 2
}
console.log(result)
const [a, b] = `12
5`.split('\n').map(Number)

let result = 3
if(a>0 && b>0){
    result = 1
}
else if(a>0 && b<0){
    result = 4
}
else if(a<0 && b>0){
    result = 2
}
console.log(result)

문제

알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.

 

 

입력

알파벳 소문자, 대문자, 숫자 0-9 중 하나가 첫째 줄에 주어진다.

 

 

출력

입력으로 주어진 글자의 아스키 코드 값을 출력한다.

 

 

풀이

알파벳 대, 소문자와 숫자 0~9라고 하지만 사실 더 많은 아스키 코드가 존재한다.

https://www.rapidtables.com/code/text/ascii-table.html

아스키 코드에 존재하는 값일 경우 str.charCodeAt()를 통해 아스키코드로 변경할 수 있으며

해당 아스키 코드를 다시 String.fromCharCode(아스키 코드)를 통해 문자로 변경할 수 있다.

const input = require('fs').readFileSync('/dev/stdin').toString().trim();
console.log(input.charCodeAt())
const input = `A`
console.log(input.charCodeAt())

문제

꼬마 정민이는 이제 A + B 정도는 쉽게 계산할 수 있다. 이제 A + B + C를 계산할 차례이다!

 

 

입력

첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 1012)이 공백을 사이에 두고 주어진다.

 

 

출력

A+B+C의 값을 출력한다.

 

 

풀이

문자열로 주어지는 값의 a, b, c를 더하는 문제로

처음부터 split(' ')으로 배열로 만든 다음 map(Number)를 통해 number type으로 변경한 값을

구조분해할당으로 a, b, c에 할당해주고

a, b, c의 합을 출력해서 해결할 수 있다.

const [a, b, c] = require('fs').readFileSync('/dev/stdin').toString().trim().split(" ").map(Number)

console.log(a+b+c)
const [a, b, c] = `3 7 9`.split(" ").map(Number)

console.log(a+b+c)

'알고리즘 > 백준' 카테고리의 다른 글

[백준 JS] 14681번 사분면 고르기  (0) 2023.03.08
[백준 JS] 11654번 아스키 코드  (0) 2023.03.08
[백준 JS] 11022번 A+B - 8  (0) 2023.03.08
[백준 JS] 11021번 A+B - 7  (0) 2023.03.08
[백준 JS] 10998번 AxB  (0) 2023.03.08

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

 

 

출력

각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다. x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.

 

 

풀이

A+B - 7과 유사한 문제로 동일하게 문자열을 받아오지만

a + b를 추가해야 하기 때문에

이런 것 처럼 들어가야 할 변수가 늘어날 경우는 백틱이 훨씬 편리하다.

 

split('\')을 통해 분할한 배열을

각각 구조분해할당으로 a, b로 받아준 다음

공백에 주의하며 백틱으로 요구출력값을 맞춰준 다음

result에 담아 한번에 출력해준다.

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

const result = []

for(i = 1 ; i < input.length ; i++){
    const [a, b] = input[i].split(' ').map(Number)
    console.log(`Case #${i}: ${a} + ${b} = ${a+b}`)
}

console.log(result.join('\n'))
const input = `5
1 1
2 3
3 4
9 8
5 2`.split('\n')

const result = []

for(i = 1 ; i < input.length ; i++){
    const [a, b] = input[i].split(' ').map(Number)
    console.log(`Case #${i}: ${a} + ${b} = ${a+b}`)
}

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

'알고리즘 > 백준' 카테고리의 다른 글

[백준 JS] 11654번 아스키 코드  (0) 2023.03.08
[백준 JS] 11382번 꼬마 정민  (0) 2023.03.08
[백준 JS] 11021번 A+B - 7  (0) 2023.03.08
[백준 JS] 10998번 AxB  (0) 2023.03.08
[백준 JS] 10952번 A+B - 5  (0) 2023.03.08

+ Recent posts