끄적끄적 코딩일지

[Programmers][1차] 비밀지도(난이도:★★★★★★) 본문

알고리즘

[Programmers][1차] 비밀지도(난이도:★★★★★★)

BaekGyuHyeon 2022. 5. 17. 09:11

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        return solutionA(n,arr1,arr2);
    }
    public String[] solutionA(int n, int[] arr1, int[] arr2){ 
        int num = getMulti(n);
        String[] answer = new String[n]; 
        for(int i = 0 ; i < n; i++){
            char[] a1 = toBinaryMap(n,num,arr1[i]).toCharArray();
            char[] a2 = toBinaryMap(n,num,arr2[i]).toCharArray();
            String ans = "";
            // ascii코드 35(#) 을 비교해서 둘중 하나라도 #이면 #을 붙이고 아니면 ' '을 붙인다.
            for(int j = 0; j < a1.length; j++){
                if(a1[j] == 35 || a2[j] == 35)
                    ans += '#';
                else
                    ans += ' ';
            }
            answer[i] = ans;
        }
        return answer;
    }
    // 2진수 변환
    // 변환 값이 0이면 빈칸을, 1이면 #을 붙여 변환된 형태로 반환한다.
    public String toBinaryMap(int n,int size,int num){
        String ans = "";
        int sub = size;
        for(int i = 0; i < n; i ++){
            int tmp = num / sub;
            ans = ans + (tmp == 0?" ":"#");
            num %= sub;
            sub /= 2;
        }
        return ans;
    }
    public int getMulti(int n){
        int res = 1;
        for(int i = 0; i < n-1; i ++)
            res *= 2;
        return res;
    }
}