카테고리 없음

프로그래머스#55(Lv.1)_[1차] 비밀지도

개발자_조이킴 2021. 11. 11. 17:03

[1차] 비밀지도 - 2018 KAKAO BLIND RECRUITMENT

다른 분들이 하신것 보고 배우고 또 배우자! (삼항연산자, padStart 메소드, replace 메소드, repeat 메소드!)

 

입출력 예시

 

// 프로그래머스 - [1차] 비밀지도

function solution(n, arr1, arr2) {
    
    // 암호화를 푼 숫자를 담아줄 빈배열 선언 (2진수로 표현된 숫자가 들어간다)
    let solvedArr1 = []
    let solvedArr2 = []
    
    // 먼저, 1차 비밀지도의 암호화를 푼다
    for(let i = 0; i < arr1.length; i++) {
        
        // 2진수로 표현하기 위한 초기틀을 만들어준다. 초기틀은 n개의 0으로 이뤄져있다.
        // ex) n = 5, zeros = [0, 0, 0, 0, 0]
        let zeros = new Array(n).fill(0)
        
        // i번째 요소 (숫자)를 curVal에 할당해준다
        let curVal = arr1[i]
        
        // 만약 curVal가 0이라면, 암호화를 따로 풀 필요없다.
        // 바로 solvedArr1에 '00000' 2진법 수를 넣어준다. (n=5이라면)
        if(curVal === 0) solvedArr1.push(zeros.join(""))
        // 만약 curVal가 1이라면, 암호화를 따로 풀 필요없다.
        // 바로 solvedArr1에 '00001' 2진법 수를 넣어준다. (n=5이라면)
        else if(curVal === 1) {
            zeros[n-1] = 1
            solvedArr1.push(zeros.join(""))
        } 
        // 이외의 경우는 따로 2진법 수를 찾아야한다. (암호를 풀어야한다)
        else {
            // while 루프문 한바퀴 돌때마다, index 변경하기 위한 cnt를 선언
            // cnt는 루프가 한번 돌때마다 1씩 증가한다.
            let cnt = 0;
            // 루프는 curVal가 1이거나, 0이면 종료된다.
            // 아래 while문은 2진법 수를 구하고, 이를 저장한다.
            while(curVal !== 1 && curVal !== 0) {
                // 현재 index
                let idx = n - 1 - cnt
                // 현재 값을 2로 나누었을 때, 나머지
                let remainder = curVal % 2
                // 나머지를 zeros 맨 끝 idx부터 넣어준다.
                // ex) n = 5라면, idx는 4, 3, 2, 1, 0 순이된다. 
                zeros[idx] = remainder
                // next step의 curVal를 다시 설정해준다.
                curVal = parseInt(curVal / 2)
                cnt++
                
                // 만약 curVal가 1이면 while문을 종료시킨다.
                // 또한, 현재 idx의 앞에 1을 할당해준다.
                if(curVal === 1) {
                    zeros[idx-1] = 1
                    break;
                }
            }
            // while문이 종료되면 암호화를 푼 2진법 수를 solvedArr1에 넣어준다.
            solvedArr1.push(zeros.join(""))
        }
        
    }
    
    // 1차 지도와 마찬가지로, 암호화된 2차 지도도 풀어준다.
    for(let i = 0; i < arr2.length; i++) {
        
        let curVal = arr2[i]
        let zeros = new Array(n).fill(0)
        
        if(curVal === 0) solvedArr2.push(zeros.join(""))
        else if(curVal === 1) {
            zeros[n-1] = 1
            solvedArr2.push(zeros.join(""))
        } else {

            let cnt = 0;
            while(curVal !== 1 && curVal !== 0) {

                let idx = n - 1 - cnt
                let remainder = curVal % 2
                zeros[idx] = remainder

                curVal = parseInt(curVal / 2)
                cnt++

                if(curVal === 1) {
                    zeros[idx-1] = 1
                    break;
                }
            }
            
            solvedArr2.push(zeros.join(""))
        }
        
    }

    // ********** arr1, arr2, 2분법으로 변환 완성 ********** //
    
    // 최종 결과(해독된 지도)를 담아줄 빈배열 result 선언
    let result = []
    
    // 1차, 2차 지도를 통해 진짜 지도를 찾는다.
    for(let i = 0; i < solvedArr1.length; i++) {
        
        let str = ''

        for(let j = 0; j < n; j++) {
            // 1차, 2차 지도 i번째 요소의 j번째 요소를 각각 value1과 value2에 할당한다.
            let value1 = Number(solvedArr1[i].split("")[j])
            let value2 = Number(solvedArr2[i].split("")[j])
            
            // 만약 1차지도와 2차지도 모두 0인 경우, 해당 요소는 빈 문자열을 넣어준다.
            if(value1 === 0 && value2 === 0) str = str + ' '
            // 이외의 경우, 해당 요소는 벽돌(#)을 넣어준다.
            else str = str + '#'
        }
      // 해독된 i번째 요소를 result에 넣어준다. 
      result.push(str)
    }

    return result
}

 

<다른분의 solution>







 

프로그래머스 1단계 마지막 문제였다.

1단계 풀면서, 좌절감과 자신감 둘다 얻었다.

공부하면서 늘 머릿속에 맴도는 문장은

 

아직도 멀었다!

이었다.

 

늦게 시작한 만큼, 아직도 갈 길이 멀었지만

초심을 기억하며,

포기하지말고 계속해서 공부하자!

화이팅:)