회고

[수습일지] - 77(주말)

Happy Programmer 2023. 6. 11. 23:52

(1).백준 2447번 별 찍기 - 10은 3의 n승의 사이즈로 된 정사각 형태의 별찍기 문제로

재귀를 통해서 문제를 해결할 수 있는 형태였다.

 

처음에는 별을 먼저 다 찍어두고 공백 부분으로 바꾸는 방식으로 진행하려고 했으나

공백 부분만 전체 지우고 내려가기에는 내용이 이상해졌고

최종적으로 해당되는 부분에 별만 찍는 것이 재귀적으로 처리가 맞는 것 같아서

다시 공백을 찍고 분할정복을 통해 문제를 해결했다.

 

기본적으로 3x3 형태로 한 변의 길이가 3의 n승으로 늘어나기 때문에

3, 9, 27, 81 등 3의 배수 형태로 각 내부의 9개가 동일한 패턴을 가지고 있었고

9개 중 중앙 부분을 전체 공백 처리를 해야 했기 때문에

위에서 언급했던 것 처럼 전체 부분을 공백으로 둔 다음

별을 채워야 하는 부분을 다시 재귀처리로 공백처리할 부분만 재귀처리를 하지 않는 방식을 선택했다.

 

아래의 b가 공백이라고 했을 때 index는 1,1이기 때문에

aaa

aba

aaa 

각 변의 길이 추가를 담당하는 l을 추가할 때

i*j가 1인 경우 중앙이라고 판단하고 재귀를 돌리지 않았고

최종적으로 변의 길이가 1이 되었다면 해당 부분은 '*'을 넣어야 하는 부분이 되었다고 인식하고

해당 부분을 '*'로 대체하는 방식으로 문제를 해결했다.

const input = 27

const result = []
for(let i = 0 ; i < input ; i++){
    result.push(new Array(input).fill(' '))
}

const recursion = (x, y, length) => {
    if(length === 1){
        result[x][y] = '*'
        return
    }

    const l = length/3
    for(let i = 0 ; i < 3 ; i++){
        for(let j = 0 ; j < 3 ; j++){
            if(i*j !== 1){
                recursion(x + i*l, y + j*l, l)
            }
        }
    }
}


recursion(0,0,input)



console.log(result.map(el => el.join('')).join('\n'))