네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
입력으로 지도의 한 변 크기 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] |
출력 | ["######", "### #", "## ##", " #### ", " #####", "### # "] |
class Solution1 {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
String code = "";
String mapCode = "";
for(int i = 0; i < n; i++) {
code = String.format("%0"+n+"d", Integer.parseInt(Integer.toBinaryString(arr1[i] | arr2[i])));
mapCode = code.replaceAll("1", "#");
mapCode = mapCode.replaceAll("0", " ");
answer[i] = mapCode;
}
return answer;
}
}
처음 제출했을 때 테스트 2와 테스트 6에서 런타임 에러가 났다
지도의 한변의 크기가 최대 16이므로 int 범위를 초과할 수 있었던 부분을 생각하지 못했다 Long으로 바꿔주고 실행시켜보니 성공!!
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
String code = "";
String mapCode = "";
for(int i = 0; i < n; i++) {
code = String.format("%0"+n+"d", Long.parseLong(Integer.toBinaryString(arr1[i] | arr2[i])));
mapCode = code.replaceAll("1", "#");
mapCode = mapCode.replaceAll("0", " ");
answer[i] = mapCode;
}
return answer;
}
}
지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이므로 or연산 적용
Integer 클래스의 함수를 사용하여 2진수로 변환
숫자형의 문자열을 첫번째 인자 값으로 받고 변환할 진수값을 입력하면 해당 진수로 변환하여 Integer형으로 반환
숫자형의 문자열을 인자 값으로 받으면 10진수의 Integer형 또는 Long형으로 반환
ex1) %10d : 문자열 왼쪽에 공백을 채워 10만큼 길이를 만듬
ex2) %-10d : 문자열 오른쪽에 공백을 채워 10만큼 길이를 만듬
ex3) %010d : 문자열 왼쪽에 0을 채워 10만큼 길이를 만듬