오늘은 뭔가 자료정리를 하고 싶었는데 

구조를 어떻게 예시를 하면 좋겠다고 생각만 하고 건드리지 못했다..

예전에 틀린 백준 문제도 시도하다가 시간을 소모하고 결국 시간초과, 메모리초과를 다시 당하고 포기했다.

 

 

(1).백준 10990번 별 찍기 - 15는 뿔 모양으로 별을 찍는 문제였다.
앞 공간에 input - i 만큼의 공백이 들어가고 
첫 번째 별을 제외한 나머지는 두개의 별 사이에 input*2 -3개의 공백이 들어가는 것을
템플릿 리터럴(`${}`)로 표현해 해결할 수 있었다.

const input = 10
const result = []
for(let i = 1 ; i <= input ; i++){
    if(i === 1){
        result.push(`${' '.repeat(input-i)}*`)
    }
    else{
        result.push(`${' '.repeat(input-i)}*${' '.repeat(2*i-3)}*`)
    }
}

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



(2).프로그래머스 공원 산책은 공원에서 시작 지점과 공원의 장애물 위치를 입력했을 때
입력이 불가능한 입력(공원을 벗어남, 장애물 만남)이 아닐 경우 명령에 따라 계속 이동하며
최종적으로 있는 위치를 출력하는 문제였다.

초기 위치를 제공해주지는 않고 문자열로 줬기 때문에 S를 찾는 작업을 하고
각각의 routes를 입력받아 order, distance로 구분한 다음
(여기서 1~9라는 범위가 있었기 때문에 split이 아닌 route[i][2]로 접근이 가능했다)
이동 가능 확인을 체크하는 함수에 넣어 처리했는데
처음에는 각각 체크를 하려고 해서 함수를 따로 뺐지만
생각보다 공통적으로 처리하기가 애매해 결국 그 함수 내부에서 다 따로 처리해버렸다.

처음에 입력받은 배열의 길이를 통해 공원의 한도인 xLimit, yLimit을 구했고
각각 방향에 따라 x, y축의 방향으로만 1씩 증가시키며 장애물을 만났을 경우 이동을 하지 않고
최종적으로 체크가 끝난 경우 해당 방향으로 distance만큼 이동시켰다.

수도코드로는 아래와 같이 정리하고 시작했다.
1.S찾기
2.이동방향 범위 체크
3.장애물 확인
4.최종 좌표값 배열형태로 출력

function solution(park, routes) {
    const xLimit = park.length-1
    const yLimit = park[0].length-1
    let x
    let y
    
    //이동 가능 확인
    const routeCheck = (order, distance) => {
        if(order === 'N'){
            if(x - distance < 0) return
            else{
                for(let i = x ; i >= x-distance ; i--){
                    if(park[i][y] === 'X') return
                }
            }
            x -= distance
        }
        else if(order === 'S'){
            if(x + distance > xLimit) return
            else{
                for(let i = x ; i <= x+distance ; i++){
                    if(park[i][y] === 'X') return
                }
            }
            x += distance
        }
        else if(order === 'W'){
            if(y - distance < 0) return
            else{
                for(let i = y ; i >= y-distance ; i--){
                    if(park[x][i] === 'X') return
                }
            }
            y -= distance
        }
        else if(order === 'E'){
            if(y + distance > yLimit) return
            else{
                for(let i = y ; i <= y+distance ; i++){
                    if(park[x][i] === 'X') return
                }
            }
            y += distance
        }
    }
    
    //S찾기
    for(let i = 0 ; i <= xLimit ; i++){
        for(let j = 0 ; j <= yLimit ; j++){
            if(park[i][j] === 'S'){
                x = i
                y = j
            }
        }
    }
    
    //좌표이동
    for(let i = 0 ; i < routes.length ; i++){
        const order = routes[i][0]
        const distance = Number(routes[i][2])
        routeCheck(order, distance)
    }
    
    return [x,y];
}

'회고' 카테고리의 다른 글

[수습일지] - 8  (0) 2023.04.03
[수습일지] - 7(주말)  (0) 2023.04.02
[수습일지] - 5  (0) 2023.03.31
[수습일지] - 4  (0) 2023.03.30
[수습일지] - 3  (0) 2023.03.29

+ Recent posts