개발/코딩테스트

[프로그래머스 | JavaScript] 비밀지도

prpn97 2023. 5. 6. 22:13

내용이 길어서 스크린샷으로 첨부했다. 

문제 풀이는 다음과 같다. 

 

function solution(n, arr1, arr2) {
    let answer = [];
    let ten1 = []
    let ten2 = []
    let ten = []
    let temp = ''
    for(let i = 0; i < n; i++){
        ten1.push(arr1[i].toString(2))
        ten2.push(arr2[i].toString(2))
    ten1[i]='0'.repeat(n-ten1[i].length)+ten1[i]
    ten2[i]='0'.repeat(n-ten2[i].length)+ten2[i]
    }
    for(let i = 0; i < n; i++){
        for(let j = 0; j < n; j++){
            if(ten1[i][j]==='1'||ten2[i][j]==='1'){
            ten.push('#')
        }else ten.push(' ')         
    }
}   
    for(let i = 0; i < ten.length; i++){
        temp+=ten[i]
        if(temp.length===n){
            answer.push(temp)
            temp = ''
        }  
}
    return answer
}

내가 봐도 장황하고 어지럽다.. 일단 내가 푼 방법은 이렇다. 

 

1. 배열 1과 2를 각각 2진법으로 바꿔서 새 배열에 담았다. 

그런데, n이 5일 경우 5자리 수가 나와야 하는데 9는 1001이 나온다.

위 그림과 같이 겹쳐야 하기 때문에 각 자릿수를 확인해서 맨 앞에 0이 필요했다.

10010과 1001을 합친다고 하면, 처음에 1과 1을 판별하는 것이 아니라

10010과 01001로 합쳐서 1과 0을 판별해야 하는 것이다. 

그래서 전체 길이인 n에서 현재 길이인 ten1[i].length를 뺀 만큼 '0'을 더했다. 

 

 

2. 2진법으로 바꾼 숫자를 1은 #, 0은 ' '(공백)으로 바꿔주었다. 

이중반복문으로 [i][j]값이 하나라도 1일 경우 #을 넣고, 나머지는 ' '을 넣었다.

 

 

3. temp에 임시적으로 문자열을 저장해서 각 자릿수에 맞게 새 배열에 넣는다.

현재 ten에는 '#','#',' '... 이런식으로 문자가 각각 하나씩 배열에 들어있는 상태다. 

이 배열을 각 자릿수 n에 맞게 구분해야 한다. 

예시와 같이 ["#####","# # #", "### #", "# ##", "#####"] 이렇게 말이다.

 

<코멘트>

ten1, ten2를 구분해서 넣기보다 같은 규칙이니까 한꺼번에 함수로 처리할 수 있을 것 같다. 

아직 다르게 풀 수 있는 방법이 떠오르지는 않는다. 

알고리즘 공부하면서 구현하지 못하더라도 시야가 트이도록 생각해보며 더 노력해야겠다. 

 

 

728x90