네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
n
인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.1
, 공백 부분을 0
으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입력으로 지도의 한 변 크기 n
과 2개의 정수 배열 arr1
, arr2
가 들어온다.
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
매개변수 | 값 |
---|---|
n | 5 |
arr1 | [9, 20, 28, 18, 11] |
arr2 | [30, 1, 21, 17, 28] |
출력 | ["#####","# # #", "### #", "# ##", "#####"] |
매개변수 | 값 |
---|---|
n | 6 |
arr1 | [46, 33, 33 ,22, 31, 50] |
arr2 | [27 ,56, 19, 14, 14, 10] |
출력 | ["######", "### #", "## ##", " #### ", " #####", "### # "] |
이 문제는 각 비트를 비교하여 하나라도 1
이라면 #
을 출력하는 문제입니다.
제가 이 문제를 보고 판단한 풀이 순서는 다음과 같습니다.
arr1
와 arr2
을 2진수로 변환합니다.#
을 넣고 아니라면 공백을 넣습니다.그런데 저는 이 문제를 푸는 과정에서 Integer.toBinaryString()
이라는 내장함수를 알게되었습니다.
매개변수에 넣은 숫자를 2진수로 변환해주는 함수였는데,
저는 매개변수에 arr1[i] | arr2[i]
를 넣어주었습니다.
arr1[i] | arr2[i]
을 하게 되면 두 수를 비트단위로 연산하여 어느 한 쪽이 1
이면 1
을 반환하고, 아니면 0
을 리턴하게 됩니다.
만약 Integer.toBinaryString(13|5)
를 하게 된다면 2진수 13
은 1101
이고, 2진수 4
는 0100
이므로 1101
을 리턴하게 되는 것입니다.
이제 비트연산과 2진수로 변환하는 작업을 마쳤습니다.
그렇다면 각각의 1
과 0
을 #
과
로 바꿔주어야 하는데 이 때 저는 String
클래스의 replace(,)
내장함수를 사용하였습니다.
처음에는 split("")
을 이용하여 또다른 배열 두 개를 만들어 하나하나 if문
으로 비교를 해줄까 생각했는데 replace()
함수는 그 문제를 해결해주었습니다.
첫 매개변수가 있다면 두번째 매개변수로 바꿔주는 replace()
를 사용하여 1
은 #
, 0
은
로 바꿔주었습니다.
이제 문제를 다 푼 줄 알고 제출을 하였는데, 오류가 발생했습니다.
찾아보니 answer[i]
의 길이가 서로 다른 부분이 있었습니다.
앞에서 예시를 들었던 13
과 4
도 각각의 2진수는 1101
과 100
로 길이가 달랐습니다.
그렇다면 최대길이에 맞도록 왼쪽에 0
을 더 추가해주어야 합니다.
저는 while문
을 통해 answer[i].length
가 n
보다 작을 동안 answer[i] = " "+answer[i]
으로 공백을 추가하였습니다.
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] = Integer.toBinaryString(arr1[i] | arr2[i]);
answer[i] = answer[i].replace("1", "#");
answer[i] = answer[i].replace("0", " ");
while ( answer[i].length() < n) {
answer[i] = " "+answer[i];
}
}
return answer;
}
}