Development

[TIL] 백준 문제 - 재귀 함수, 정렬 / 병합 정렬 공부

개발자 강정 2022. 2. 9. 20:42

자바스크립트 코딩테스트

백준 2447번: 별 찍기 - 10

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

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

어떻게 풀어야 할지 고민이 많았다. Array 형태로 저장해서 풀 수 있었다.

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

const [N] = input.map((x) => +x)

function recursiveStar(N) {
    if (N === 3) {
        return ['***', '* *', '***']
    }
    let starArray = []
    for (let i = 0; i < 3; i++) {
        for (let line of recursiveStar(N / 3)) {
            if (i === 1) {
                starArray.push(line + ' '.repeat(line.length) + line)
                continue
            }
            starArray.push(line.repeat(3))
        }
    }
    return starArray
}

console.log(recursiveStar(N).join('\n'))

아름답다.

N = 81

 

18870번: 좌표 압축

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

 

18870번: 좌표 압축

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌

www.acmicpc.net

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

const notSorted = input[1].split(' ').map((x) => +x)
const sorted = Array.from(new Set(notSorted))
    .sort((a, b) => a - b)
    .reduce((dict, value, index) => {
        dict[value] = index
        return dict
    }, {})

answer = []
for (const num of notSorted) {
    answer.push(sorted[num])
}

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

.findIndex() 보다 value값을 index로 저장한 object를 만드는 것이 더 빨랐다.

 

2448번: 별 찍기 - 11

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

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

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

const N = +input[0]

function triangle(N) {
    if (N === 3) {
        return ['  *  ', ' * * ', '*****']
    }

    // 이전 단위 삼각형의 밑변 길이
    const base = triangle(N / 2)[triangle(N / 2).length - 1].length
    // 그리려는 삼각형의 밑변 길이
    const currentBase = 2 * base + 1

    const triangleArray = []
    // 윗 부분 그리기
    for (const line of triangle(N / 2)) {
        triangleArray.push(
            ' '.repeat((currentBase - line.length) / 2) +
                line +
                ' '.repeat((currentBase - line.length) / 2)
        )
    }
    // 아랫 부분 그리기
    for (const line of triangle(N / 2)) {
        triangleArray.push(line + ' ' + line)
    }
    return triangleArray
}

console.log(triangle(N).join('\n'))

오늘은 별 찍기가 재밌다.

N = 48

 

알고리즘 강의 수강 - 병합 정렬 (merge sort)

 

노마드 코더 - 줌 클론코딩 시작