문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

 

 

입력

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

 

 

출력

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

 

 

풀이 

별 찍기 - 9는 8을 90도 회전한 느낌으로 모래시계 형태의 별을 찍어야 했다.

 

별의 갯수가 input*2 -1개로 시작해서 1개까지 점차 줄어든 다음 

다시 시작한 갯수만큼 늘어나야 했기 때문에 공백은 앞에 하나씩 추가하며 별의 갯수는 2개씩 줄여 1개로 만들고

그 뒤로는 다시 역순으로 진행했으며 중간의 별 한칸이 중요했기 때문에 시작점을 input이 아닌 input -1로 지정했다.

이 문제 또한 다른 별 찍기 문제들처럼 템플릿 리터럴(`${}`)과 repeat을 사용해 해결할 수 있는 문제였다. 

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

for(let i = 1 ; i <= input ; i++){
    result.push(`${' '.repeat(i-1)}${'*'.repeat(input*2+1-i*2)}`)
}
for(let i = input-1 ; i >= 1 ; i--){
    result.push(`${' '.repeat(i-1)}${'*'.repeat(input*2+1-i*2)}`)
}

console.log(result.join('\n'))
const input = 10
const result = []

for(let i = 1 ; i <= input ; i++){
    result.push(`${' '.repeat(i-1)}${'*'.repeat(input*2+1-i*2)}`)
}
for(let i = input-1 ; i >= 1 ; i--){
    result.push(`${' '.repeat(i-1)}${'*'.repeat(input*2+1-i*2)}`)
}

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

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

[백준 JS] 2445번 별 찍기 - 8  (0) 2023.04.01
[백준 JS] 2444번 별 찍기 - 7  (0) 2023.04.01
[백준 JS] 2443번 별 찍기 - 6  (0) 2023.03.13
[백준 JS] 2442번 별 찍기 - 5  (0) 2023.03.13
[백준 JS] 2441번 별 찍기 - 4  (0) 2023.03.13

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

 

 

입력

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

 

 

출력

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

 

 

풀이

별 찍기 - 8은 나비모양과 유사한 형태로 별을 찍어야 하는 문제였는데

별 사이에 공백이 (input-i) * 2, 별들은 각각 input개가 앞 뒤에 존재하는 규칙이었다.

다만 input까지의 줄을 입력한 다음에는 다시 위에서 진행한 내용의 역순으로 내려가기 때문에

for문을 통해 역순으로 진행했다.

 

일반적으로는 .repeat()을 사용해 반복을 진행해야 하지만

아래는 .repeat을 사용하지 못할 때 사용했던 원시적인 해결방법이다.

(그 아래에 제출했던 코드와 console로 찍을 수 있는 코드가 존재한다)

//예전의 특이한 코드인데 지나치게 특이해서 올려봤다
let input = 5
let result = ''
function star(num) {
    let result = ''
    for(let i = 0 ; i < num ; i++){
        result += '*'
    }
    return result
}

function blank(num) {
    let result = ''
    for(let i = 0 ; i < num ; i++){
        result += `  `
    }
    return result    
}
for(let i = 1 ; i <= input ; i++){
    result +=`${star(i)}${blank(input-i)}${star(i)}\n`
}
for(let i = input-1 ; i >= 1 ; i--){
    result +=`${star(i)}${blank(input-i)}${star(i)}\n`
}

console.log(result)
const input = Number(require('fs').readFileSync('/dev/stdin').toString().trim())
const result = []

for(let i = 1 ; i <= input ; i++){
    result.push(`${'*'.repeat(i)}${'  '.repeat(input-i)}${'*'.repeat(i)}`)
}
for(let i = input-1 ; i >= 1 ; i--){
    result.push(`${'*'.repeat(i)}${'  '.repeat(input-i)}${'*'.repeat(i)}`)
}

console.log(result.join('\n'))
const input = 10
const result = []

for(let i = 1 ; i <= input ; i++){
    result.push(`${'*'.repeat(i)}${'  '.repeat(input-i)}${'*'.repeat(i)}`)
}
for(let i = input-1 ; i >= 1 ; i--){
    result.push(`${'*'.repeat(i)}${'  '.repeat(input-i)}${'*'.repeat(i)}`)
}

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

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

[백준 JS] 2446번 별 찍기 - 9  (0) 2023.04.01
[백준 JS] 2444번 별 찍기 - 7  (0) 2023.04.01
[백준 JS] 2443번 별 찍기 - 6  (0) 2023.03.13
[백준 JS] 2442번 별 찍기 - 5  (0) 2023.03.13
[백준 JS] 2441번 별 찍기 - 4  (0) 2023.03.13

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

 

 

입력

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

 

 

출력

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

 

 

풀이

별을 다이아몬드 모양으로 찍어야 하는 문제로 

input번째 줄 까지는 피라미드 형식으로 진행되고

그 이후로는 다시 역 피라미드 형식으로 별을 줄여나가는 모양이었다.

 

일단 입력을 지금 보니 공백을 input - i개로 진행한 다음 별의 갯수는 i*2-1로 했어도 될 것 같은데

당시 푼 문제에서는 '**'에 '*'을 추가한 모습이 재미있다.

 

이전 코드는 얼핏 보기에는 문제가 없었도 const 대신 let이 있는 부분만 수정했었는데

i*2 -1개로 수정하지 않은 부분은 아쉽지만 두 가지 방법을 보며

문제에 따라 저렇게 할 수는 있겠다는 여지를 남기기 위해 그대로 올렸다.

 

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

const result = []
for(let i = 1 ; i <= input ; i++){
    result.push(`${' '.repeat(input-i)}${'**'.repeat(i-1)}*`)
}
for(let i = input-1 ; i > 0 ; i--){
    result.push(`${' '.repeat(input-i)}${'**'.repeat(i-1)}*`)
}
console.log(result.join('\n'))
const input = 10

const result = []
for(let i = 1 ; i <= input ; i++){
    result.push(`${' '.repeat(input-i)}${'**'.repeat(i-1)}*`)
}
for(let i = input-1 ; i > 0 ; i--){
    result.push(`${' '.repeat(input-i)}${'**'.repeat(i-1)}*`)
}
console.log(result.join('\n'))

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

[백준 JS] 2446번 별 찍기 - 9  (0) 2023.04.01
[백준 JS] 2445번 별 찍기 - 8  (0) 2023.04.01
[백준 JS] 2443번 별 찍기 - 6  (0) 2023.03.13
[백준 JS] 2442번 별 찍기 - 5  (0) 2023.03.13
[백준 JS] 2441번 별 찍기 - 4  (0) 2023.03.13

문제

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

별은 가운데를 기준으로 대칭이어야 한다.

 

 

입력

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

 

 

출력

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

 

 

풀이

별 찍기 - 5와 유사한 문제지만 앞 뒤 순서만 다른 문제였다.

 

이 문제 또한 input *2 -1개의 별로 시작해서

앞에 공백의 갯수를 1씩 증가시키며 추가하는 문제였다.

 

i를 0으로 시작해서 공백에 i를 넣어주고

*의 갯수에는 (input-i)*2 -1로 진행해도 괜찮겠지만

기존에 별 찍기 - 5에서 진행한 코드를 역방향으로 뒤집는 진행 또한 가능하다.

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

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

[백준 JS] 2445번 별 찍기 - 8  (0) 2023.04.01
[백준 JS] 2444번 별 찍기 - 7  (0) 2023.04.01
[백준 JS] 2442번 별 찍기 - 5  (0) 2023.03.13
[백준 JS] 2441번 별 찍기 - 4  (0) 2023.03.13
[백준 JS] 2010번 플러그  (0) 2023.03.13

문제

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

별은 가운데를 기준으로 대칭이어야 한다.

 

 

입력

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

 

 

출력

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

 

 

풀이

트리 형태를 만들어야 하는 문제로

별의 갯수는 1개부터 (input * 2) - 1 만큼의 갯수까지 2개씩 늘어나는 규칙이 있고

공백의 갯수는 input - 1부터 0개까지 진행되기 때문에

for문에서 i의 시작은 1, 조건은 input보다 작거나 같다로 진행했다.

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

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

[백준 JS] 2444번 별 찍기 - 7  (0) 2023.04.01
[백준 JS] 2443번 별 찍기 - 6  (0) 2023.03.13
[백준 JS] 2441번 별 찍기 - 4  (0) 2023.03.13
[백준 JS] 2010번 플러그  (0) 2023.03.13
[백준 JS] 1837번 암호제작  (0) 2023.03.13

문제

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

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

 

 

입력

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

 

 

출력

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

 

 

풀이

별을 input의 갯수만큼 시작해서 하나씩 줄여나가며

해당 위치에는 공백을 추가해야 하는 문제로 

각각의 갯수는 .repeat() 메서드를 사용해 처리했으며

공통적으로 공백과 별의 갯수의 합이 input만큼이기 때문에

input으로 시작한 i의 갯수만큼의 별과 input - i만큼의 공백을 주어진 조건에 맞게 출력했다.

 

제한 조건이 N < 100이기 때문에 딱히 result 배열에 담아서 한번에 출력할 필요는 없지만

일관된 코드 작성이 가독성 면에서 유리하기 때문에 result에 담아서 출력했다.

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

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

[백준 JS] 2443번 별 찍기 - 6  (0) 2023.03.13
[백준 JS] 2442번 별 찍기 - 5  (0) 2023.03.13
[백준 JS] 2010번 플러그  (0) 2023.03.13
[백준 JS] 1837번 암호제작  (0) 2023.03.13
[백준 JS] 1703번 생장점  (0) 2023.03.13

문제

선영이의 집에는 콘센트를 꽂을 수 있는 플러그가 하나밖에 없다. 선영이는 많은 컴퓨터를 가지고 있는데, 컴퓨터의 전원 문제는 어떻게 해결하는 것일까?

하나의 플러그가 있고, N개의 멀티탭이 있다. 각 멀티탭은 몇 개의 플러그로 이루어져 있다고 한다. 최대 몇 대의 컴퓨터를 전원에 연결할 수 있을까?

 

 

입력

첫째 줄에 멀티탭의 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 이어서 둘째 줄부터 N개의 줄에 걸쳐 각 멀티탭이 몇 개의 플러그를 꽂을 수 있도록 되어 있는지를 나타내는 자연수가 주어진다. 이 자연수는 1,000을 넘지 않는다.

 

 

출력

첫째 줄에 최대로 전원에 연결될 수 있는 컴퓨터의 수를 출력한다.

 

 

풀이

멀티탭을 추가하기 위해서는 기존에 있던 콘센트에 끼워야 하기 때문에

총 여유공간에서 1을 차감한 다음 멀티탭의 플러그 수용치를 추가해야 한다.

 

첫 번째 줄에서는 테스트케이스가 주어지기 때문에 

i의 시작을 1부터 진행했고 그 외 특이사항은 존재하지 않는다.

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

let sum = 1
for(let i = 1 ; i < input.length ; i++){
    sum = sum - 1 + input[i]
}
console.log(sum)
const input = `3
1
1
1`.split('\n').map(Number)

let sum = 1
for(let i = 1 ; i < input.length ; i++){
    sum = sum - 1 + input[i]
}
console.log(sum)

문제

원룡이는 한 컴퓨터 보안 회사에서 일을 하고 있다. 그러던 도중, 원룡이는 YESWOA.COM 으로부터 홈페이지 유저들의 비밀키를 만들라는 지시를 받았다. 원룡이는 비밀 키를 다음과 같은 방법으로 만들었다.

개인마다 어떤 특정한 소수 p와 q를 주어 두 소수의 곱 pq를 비밀 키로 두었다. 이렇게 해 주면 두 소수 p,q를 알지 못하는 이상, 비밀 키를 알 수 없다는 장점을 가지고 있다.

하지만 원룡이는 한 가지 사실을 잊고 말았다. 최근 컴퓨터 기술이 발달함에 따라, 소수가 작은 경우에는 컴퓨터로 모든 경우의 수를 돌려보아 비밀 키를 쉽게 알 수 있다는 것이다.

원룡이는 주성조교님께 비밀 키를 제출하려던 바로 직전에 이 사실을 알아냈다. 그래서 두 소수 p, q 중 하나라도 K보다 작은 암호는 좋지 않은 암호로 간주하여 제출하지 않기로 하였다. 이것을 손으로 직접 구해보는 일은 매우 힘들 것이다. 당신은 원룡이를 도와 두 소수의 곱으로 이루어진 암호와 K가 주어져 있을 때, 그 암호가 좋은 암호인지 좋지 않은 암호인지 구하는 프로그램을 작성하여야 한다.

 

 

입력

암호 P(4 ≤ P ≤ 10^100)와 K (2 ≤ K ≤ 10^6) 이 주어진다.

 

 

출력

만약에 그 암호가 좋은 암호이면 첫째 줄에 GOOD을 출력하고, 만약에 좋지 않은 암호이면 BAD와 소수 r을 공백으로 구분하여 출력하는데 r은 암호를 이루는 두 소수 중 작은 소수를 의미한다.

 

 

풀이

암호의 수준을 판별하는 문제로

앞의 P는 크게 상관할 필요는 없지만 연산을 위해 BigInt로 값을 다뤄야 한다는 부분을 주의해야 하며

K가 100만까지의 숫자기 때문에 결론적으로 K까지의 소수들을 구한 다음

P가 K 이하의 소수 중 하나로 나눠질 경우 BAD와 그 숫자를 출력하고

아닐 경우 GOOD을 출력하는 문제였다.

 

소수 여부를 확인하기 위해서는 소수체크 함수로 모두 체크해도 되겠지만

2부터 k까지의 모든 숫자를 확인해야 하는 문제기 때문에

에라토스테네스의 체를 사용하는 것이 유리하다고 판단했다.

 

소수 판별 배열의 초기값을 1로 만든 다음

해당 숫자의 배수들을 0으로 바꿔주며

소수일 경우 입력된 암호가 그 소수로 나눠지는지 체크해

나눠질 경우 BAD와 그 소수를 출력하는 방식으로 진행했다.

 

BigInt를 중간중간 사용하면서 type Error가 생기지 않도록 주의하고

에라토스테네스의 사용법만 알면 부담없이 해결할 수 있는 문제였다.

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

let num = BigInt(input[0])
let k = Number(input[1])

const arr = new Array(k).fill(1)
let result = "GOOD"

for(let i = 2 ; i <= k ; i ++){
    let bigI = BigInt(i)
    if(arr[i]){
        if(num%bigI === 0n){
            result = `BAD ${i}`
            break
        }
        let n = 2
        while(i*n <= k){
            arr[i*n] = 0
            n++
        }
    }
}

console.log(result)
const input = `143 10`.split(' ')

let num = BigInt(input[0])
let k = Number(input[1])

const arr = new Array(k).fill(1)
let result = "GOOD"

for(let i = 2 ; i <= k ; i ++){
    let bigI = BigInt(i)
    if(arr[i]){
        if(num%bigI === 0n){
            result = `BAD ${i}`
            break
        }
        let n = 2
        while(i*n <= k){
            arr[i*n] = 0
            n++
        }
    }
}

console.log(result)

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

[백준 JS] 2441번 별 찍기 - 4  (0) 2023.03.13
[백준 JS] 2010번 플러그  (0) 2023.03.13
[백준 JS] 1703번 생장점  (0) 2023.03.13
[백준 JS] 1598번 꼬리를 무는 숫자 나열  (0) 2023.03.13
[백준 JS] 1547번 공  (0) 2023.03.13

문제

branchorama 나무는 특이한 규칙을 가지고 성장합니다. 어린 branchorama 초목은 하나의 잎을 꼭대기에 가진 가는 묘목이며, 그 잎에는 생장점이 있습니다. 성장하는 계절 동안 나무의 생장점들은 여러 개의 가지로 나뉘게 되며, 성장이 끝나면 각 가지는 생장점을 가진 하나의 잎을 꼭대기에 매달게 됩니다. 놀랍게도 같은 나무의 모든 생장점들은 같은 숫자(splitting factor)의 가지로 나뉘며, 그 숫자는 해가 지남에 따라 변합니다.

아래의 예는 Brown 씨의 과수원에서 한 branchorama 나무가 유목에서부터 3년간 자란 결과를 보여줍니다.

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

예시에서 예측할 수 있듯이, branchorama 나무는 과밀하게 성장하는 경향이 있습니다. 따라서 Brown 씨는 매 겨울마다 과도하게 성장한 나무들의 가지를 쳐냅니다. 아래는 가지를 쳐낸  branchorama 나무의 예입니다

branchorama 나뭇잎은 굉장히 크고 광합성에 유리하지만, 오직 생장점이 온전히 보존된 가지의 끝에만 달립니다. 따라서 나무가 버티지 못할 정도로 가지를 쳐내는 일은 없어야 합니다.

Brown 씨는 각 나무가 몇 개의 잎을 가졌는지 알고 싶어합니다. 나뭇잎을 일일이 세는 것은 지루하기 때문에, 각 해(level) 성장기의 splitting factor와 그 해 겨울에 쳐낸 가지의 수를 이용해 Brown 씨에게 나뭇잎의 수를 알려주세요.

 

 

입력

입력의 각 줄은 하나의 branchorama 나무를 의미합니다.

각 줄은 나무의 나이 a(1 ≤ a ≤ 20)로 시작하며, 그 뒤로 2a 개의 정수가 공백을 두고 주어집니다. 2a 개의 정수는 splitting factor와 가지치기 한 가지의 수가 level 별로 나열된 것입니다.

마지막 줄로  '0'이 주어지며 더 이상의 입력은 없습니다. '0'은 처리하지 않습니다.

 

 

출력

각 나무에 대하여 나무에 달려있는 잎의 수를 한 줄씩 출력하세요. 나뭇잎의 수가 signed 32-bit integer를 초과하지 않는다고 가정해도 좋습니다.

 

 

풀이

생장점은 분할, 가지치기를 반복했을 때 최종적으로 남은 가지의 숫자를 구하는 문제다.

 

잎의 수를 출력하라고 하지만 가지치기를 당하지 않은 나무만 추가로 확장되며

가지치기를 하지 않은 나무만 최종상태에서 잎이 달린다고 하기 때문에

결론적으로는 가지의 숫자를 구하는 것이 맞다.

 

출력 조건은 다행히 적당한 범위 안에 있다고 하는 것 같기 때문에 BigInt를 사용하지는 않아도 되는 문제로

각각의 케이스를 받아온 다음 

년수가 지날 때 마다 초기값 1로 세팅된 가지의 숫자에 분할될 숫자를 곱해준 다음

가지치기할 숫자를 빼고 다음 년도로 넘어간다.

 

최종적으로 년도가 끝난 다음 result에 결과를 담아주고 모든 케이스가 끝난 경우 출력해서 해결했다.

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

const result = []

for(let i = 0 ; i < input.length-1 ; i++){
    const eachCase = input[i].split(' ').map(Number)
    let leafNumb = 1
    for(let j = 1 ; j < eachCase.length ; j += 2){
        leafNumb *= eachCase[j]
        leafNumb -= eachCase[j+1]
    }
    result.push(leafNumb)
}

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

const result = []

for(let i = 0 ; i < input.length-1 ; i++){
    const eachCase = input[i].split(' ').map(Number)
    let leafNumb = 1
    for(let j = 1 ; j < eachCase.length ; j += 2){
        leafNumb *= eachCase[j]
        leafNumb -= eachCase[j+1]
    }
    result.push(leafNumb)
}

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

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

[백준 JS] 2010번 플러그  (0) 2023.03.13
[백준 JS] 1837번 암호제작  (0) 2023.03.13
[백준 JS] 1598번 꼬리를 무는 숫자 나열  (0) 2023.03.13
[백준 JS] 1547번 공  (0) 2023.03.13
[백준 JS] 1284번 집 주소  (0) 2023.03.13

문제

동물원에서 막 탈출한 원숭이 한 마리가 세상구경을 하고 있다. 그 녀석은 원주 부근을 돌아다니다가 코레스코 콘도에서 아주 재밌는 놀이를 발견했다. 그 놀이의 이름은 바로 “꼬리를 무는 숫자 나열”. 이제부터 원숭이가 그토록 좋아하던 그 놀이를 파헤쳐보자.

놀이의 방법은 간단하다. 일단 4줄짜리 표에 왼쪽부터 수를 아래로 1부터 순서대로 적어나간다. 다음에 그 예가 잘 나타나있다.

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

이제 원숭이는 두 개의 자연수를 아무거나 생각한다. 그리고 숫자판에서 두 개의 자연수 사이의 직각거리를 구하면 된다. 여기서 직각거리는 동서방향거리와 남북방향거리의 합을 뜻한다.

예를 들어 저 숫자판에서 11과 33을 생각했다고 하자. 그렇다면 11과 33사이의 직각거리는 8이 된다.(동서방향거리 : 6, 남북방향거리 : 2) 다음 그림에 잘 나타나있다.

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

하지만 원숭이는 지금 혼란스럽다. 동물원에서 탈출한지 얼마 되지 않아서 계산을 할 수 없는 경지에 이르렀다. 여러분이 불쌍한 원숭이를 좀 도와줘야겠다. 원숭이가 생각한 두 자연수 사이의 직각거리를 구하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 원숭이가 생각한 두 개의 자연수가 주어진다. 각 수는 10,000,000 이하이다.

 

 

출력

첫째 줄에 원숭이가 생각한 두 개의 자연수 사이의 직각거리를 출력한다.

 

 

풀이

간단하게 풀어서 말하자면 각각의 x,y축 좌표값을 구해준 다음

그 좌표값의 차이를 구하면 되는 문제다.

 

a의 위치와 b의 위치의 차이를 구할 때

일반적으로는 a가 작고 b가 크다고 생각해서 앞의 계산에서는 Math.abs를 빼먹을 수 있는데

(실제로 예전 코드를 보니 빼먹고 제출했는데 통과되어있다..  테스트케이스를 대충 짠 느낌이다)

a보다 b가 크다는 보장이 없기 때문에 Math.abs()로 감싸줘야 한다.

 

이를 방지하기 위해서는 Math.max(a,b), Math.min(a,b)를 통해 max, min으로 좌표값을 수정할 수 있지만

오히려 그게 더 번거로울 수 있다.

 

결론적으로 좌표값은 5의 경우 (0,1)이 되고 8의 경우 (3,2)가 되는 등

x축의 좌표는 (x-1)/4의 몫, y축의 좌표는 (x-1)%4인 나머지 값임을 알 수 있고

a, b의 x축, y축 값들의 차이를 Math.abs로 처리해 해결했다.

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

console.log(Math.abs(Math.floor((b-1)/4)-Math.floor((a-1)/4))+Math.abs((b-1)%4-(a-1)%4) )
const [a,b] = `11 33`.split(' ').map(Number)

console.log(Math.abs(Math.floor((b-1)/4)-Math.floor((a-1)/4))+Math.abs((b-1)%4-(a-1)%4) )

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

[백준 JS] 1837번 암호제작  (0) 2023.03.13
[백준 JS] 1703번 생장점  (0) 2023.03.13
[백준 JS] 1547번 공  (0) 2023.03.13
[백준 JS] 1284번 집 주소  (0) 2023.03.13
[백준 JS] 1267번 핸드폰 요금  (0) 2023.03.13

문제

세준이는 컵 3개를 탁자 위에 일렬로 엎어놓았다. 컵의 번호는 맨 왼쪽 컵부터 순서대로 1번, 2번 3번이고, 세준이는 이 컵을 이용해서 게임을 하려고 한다.

먼저 1번 컵의 아래에 공을 하나 넣는다. 세준이는 두 컵을 고른 다음, 그 위치를 맞바꾸려고 한다. 예를 들어, 고른 컵이 1번과 2번이라면, 1번 컵이 있던 위치에 2번 컵을 이동시키고, 동시에 2번 컵이 있던 위치에 1번 컵을 이동시켜야 한다. 이때 공은 움직이지 않기 때문에, 공의 위치는 맨 처음 1번 컵이 있던 위치와 같다.

세준이는 컵의 위치를 총 M번 바꿀 것이며, 컵의 위치를 바꾼 방법이 입력으로 주어진다. 위치를 M번 바꾼 이후에 공이 들어있는 컵의 번호를 구하는 프로그램을 작성하시오.

 

 

입력

첫째 줄에 컵의 위치를 바꾼 횟수 M이 주어지며, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 컵의 위치를 바꾼 방법 X와 Y가 주어지며, X번 컵과 Y번 컵의 위치를 서로 바꾸는 것을 의미한다. X와 Y의 값은 3보다 작거나 같고, X와 Y가 같을 수도 있다.

컵을 이동시킨 후에 공이 컵 바깥에 있는 경우는 없다.

 

 

출력

첫째 줄에 공이 들어있는 컵의 번호를 출력한다. 공이 사라져서 컵 밑에 없는 경우에는 -1을 출력한다.

 

 

풀이 

현재 위치를 now라는 변수에 저장해준 다음

now라는 변수에 할당된 값이 옮겨진 공의 위치(여기서는 a, b라고 칭한다)에 포함되어 있을 경우

a가 now일 경우 now에는 b를 할당하고 b가 now일 경우 now에 a를 할당하는 방식으로

공의 위치가 교환되었음을 나타낼 수 있다.

 

모든 처리가 끝난 후 now를 출력해 문제를 해결할 수 있다.

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

let now = '1'

for(let i = 1 ; i < input.length ; i++){
    const [a,b] = input[i].split(' ')
    if(a === now){
        now = b
    }
    else if(b === now){
        now = a
    }
}
console.log(now)
const input = `5
2 3
1 3
2 3
2 1
3 1`.split('\n')

let now = '1'

for(let i = 1 ; i < input.length ; i++){
    const [a,b] = input[i].split(' ')
    if(a === now){
        now = b
    }
    else if(b === now){
        now = a
    }
}
console.log(now)

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

[백준 JS] 1703번 생장점  (0) 2023.03.13
[백준 JS] 1598번 꼬리를 무는 숫자 나열  (0) 2023.03.13
[백준 JS] 1284번 집 주소  (0) 2023.03.13
[백준 JS] 1267번 핸드폰 요금  (0) 2023.03.13
[백준 JS] 1247번 부호  (0) 2023.03.13

문제

재석이는 대문에 붙이는 (주소를 나타내는) 호수판 제작업체의 직원이다. 고객에게 전달할 호수판은 숫자와 숫자 사이 그리고 왼쪽 오른쪽으로 적당히 여백이 들어가 줘야하고 숫자마다 차지하는 간격이 조금씩 상이하다. 다행이도 규칙은 매우 간단하다. 

  1. 각 숫자 사이에는 1cm의 여백이 들어가야한다.
  2. 1은 2cm의 너비를 차지해야한다. 0은 4cm의 너비를 차지해야한다. 나머지 숫자는 모두 3cm의 너비를 차지한다.
  3. 호수판의 경계와 숫자 사이에는 1cm의 여백이 들어가야한다.

예를 들어 위의 120 같은 경우,  각 숫자 사이에 여백이 1cm 씩 2개 들어간다. 1은 2cm, 2는 3cm, 0은 4cm를 차지한다. 오른쪽, 왼쪽 경계에서 각각 여백이 1cm씩 차지한다. 따라서 총 2 + 2 + 3 + 4 + 1 + 1 = 13(cm) 가 된다.

재석이는 고객에게 전달해야할 호수판의 너비가 얼마나 되는지 궁금해졌다. 재석이를 도와주자!

 

 

입력

호수판에 들어갈 숫자 N의 범위는 1 ≤ N ≤ 9999 이다.

입력은 마지막에 0이 들어오기 전까지 계속해서 줄 단위로 주어진다.

또한, 마지막의 0은 처리하지 않는다.

 

 

출력

각 입력마다 얼마만큼 너비를 차지하는지 정수로 출력하면 된다.

각 출력은 줄바꿈으로 구분되어야한다.

 

 

풀이 

숫자 1은 2cm, 숫자 0은 4cm, 나머지는 3cm라고 주어지는데

여백을 포함하려면 숫자 갯수 +1만큼의 값을 더 더해줘야 하기 때문에

초기 세팅 값은 1cm로 두고 1 = 3cm, 0 = 5cm, 나머지 = 4cm 라고 인식하고 푸는 것이 더 편하다.

 

또한 입력의 마지막은 0이기 때문에 마지막 한줄은 무시하는 방식으로 진행할 수 있으며

전체적인 결과를 result에 담아 한번에 출력해준다.

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

const result = []
for(let i = 0 ; i < input.length-1 ; i++){
    let sum = 1
    for(let j = 0 ; j < input[i].length ; j++){
        if(input[i][j] === '0'){
            sum += 5
        }
        else if(input[i][j] === '1'){
            sum += 3
        }
        else{
            sum += 4
        }
    }
    result.push(sum)
}

console.log(result.join('\n'))
const input = `120
5611
100
0`.split('\n')

const result = []
for(let i = 0 ; i < input.length-1 ; i++){
    let sum = 1
    for(let j = 0 ; j < input[i].length ; j++){
        if(input[i][j] === '0'){
            sum += 5
        }
        else if(input[i][j] === '1'){
            sum += 3
        }
        else{
            sum += 4
        }
    }
    result.push(sum)
}

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

+ Recent posts