본문 바로가기

Algorithm/Programmers

[2018 KAKAO BLIND RECRUITMENT][비트마스킹] 비밀지도 - Java

문제 바로가기

 

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

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

programmers.co.kr

 

비트마스킹을 이용하면 아주 간단히 풀 수 있는 문제랍니다.

비트마스킹 연습합시다!!

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
		String[] answer = new String[n];

		for(int i = 0; i < n; i++) {
			answer[i] = String.format("%" + n + "s", toBinary(arr1[i] | arr2[i]));
		}
		
		return answer;
	}
	
	public String toBinary(int num) {
		StringBuilder sb = new StringBuilder();
		
		while(num > 0) {
			sb.append((num & 1) == 1 ? '#' : ' ');
			num = num >> 1;
		}
		
		return sb.reverse().toString();
	}
}

아아주 간단합니다. 

 

두 지도를 겹치는데, 둘 중 하나라도 벽인 부분은 전체 지도에서도 벽이다 -> |(or) 연산을 사용하면 됩니다.!!

그럼 십진수로 된 새로운 지도를 구했습니다. 얘를 " ### #" 요런 식으로 바꾸어 주어야 겠죠. 이것도 비트마스킹을 사용했습니다. 

 

(num & 1) 의 값을 보고 홀수인지 짝수인지 판별할 수 있겠죠. 그럼 이걸로 이진수도 만들어 낼 수가 있습니당. 

근디 요렇게 나누면 지도 모양 반대가 되겠죵. 또한 지도는 n * n 의 크기를 갖고 있기 때문에 reverse()하고 왼쪽에다가 패딩을 주면 됩니다!!

 

 

작년에 맨 처음 풀었을 때는 눈물의 똥꼬쑈를 했었는데....

비트마스킹 연습합시다!!!

 

* 참고: Integer.toBinaryString(int i) 라는 메소드가 있네여^^;;; 짱이네 진짜