소소한 개발이야기

[Programmers 문제풀이 JAVA] Level 5 비밀지도 (2017 카카오 블라인드) 본문

Programmers

[Programmers 문제풀이 JAVA] Level 5 비밀지도 (2017 카카오 블라인드)

plplim 2019. 6. 6. 22:01

 

📄 비밀지도

🔗 문제 풀러가기


문제는 2진수의 OR연산을 이용해 해결하였습니다. 문제의 조건을 살펴보면 2개의 지도가 주어지는데 벽(#) 또는 공백으로 이루어져 있습니다. 예시에서 친절하게 2진수로 나타낼 수 있다고 알려주고 있습니다. 그렇다면 2개의 지도를 겹쳐 두 지도에서 모두 공백인 부분을 찾아내는 것이 목표인데 OR연산을 이용하면 쉽게 문제를 해결할 수 있습니다.

다만 문제의 입력이 2진수가 아닌 10진수로 주어지기 때문에 이를 2진수로 변경해야지 문제를 해결할 수 있습니다. 직접 변경해도 되지만 JAVA에서 10진수를 2진수로 변경시킬 수 있는 함수 Integer.toBinaryString을 활용해 문제를 해결할 수 있습니다.

주의사항

문제에서 주어지는 지도는 n x n 이지만 10진수를 2진수로 변경했을 때 길이가 n이 나오지 않을 때가 있습니다. 문제의 예시에서 보면 10진수 9는 2진수로 변경하면 1001(2) 가 되는데 지도의 크기만큼 2진수를 만들어야 문제를 해결할 수 있기 때문에 빈 공간에는 0을 붙여주는 예외 처리를 해줘야 합니다.

글보단 소스코드를 보면 쉽게 이해할 수 있습니다.

 


🌱 Solution 함수

public String[] solution(int n, int[] arr1, int[] arr2) {
    String[] decodedMap = decodeMap(n, arr1, arr2);
    return decodedMap;
}

🌱 decodeMap 함수

두 지도를 입력받아 해석하는 함수입니다.

private String[] decodeMap(int n, int[] arr1, int[] arr2) {
    String[] answer = new String[n];
    for (int i = 0; i < n; i++) {
        answer[i] = checkFormat(Integer.toBinaryString(arr1[i] | arr2[i]).replace("0", " ").replace("1", "#"), n);
    }
    return answer;
}

🌱 checkFormat 함수

2진수로 변경했을 경우 지도의 크기보다 작은지 확인해 변경해주는 함수입니다.

private String checkFormat(String binaryString, int n) {
    while (binaryString.length() < n) {
        binaryString = " " + binaryString;
    }
    return binaryString;
}

💡 Github에 더 많은 문제 풀이가 있습니다.

Programmers 문제 풀이

BaekJoon Online Judge 문제 풀이

Comments