
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.

입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
예제 1
| 매개변수 | 값 |
|---|---|
n | 5 |
arr1 | [9, 20, 28, 18, 11] |
arr2 | [30, 1, 21, 17, 28] |
| 출력 | ["#####", "# # #", "### #", "# ##", "#####"] |
예제 2
| 매개변수 | 값 |
|---|---|
n | 6 |
arr1 | [46, 33, 33, 22, 31, 50] |
arr2 | [27, 56, 19, 14, 14, 10] |
| 출력 | ["######", "### #", "## ##", " #### ", " #####", "### # "] |
두 정수 배열의 같은 인덱스의 숫자를 2진수 OR 연산을 해서 2진수로 만든다.
2진수의 1인 부분은 '#'으로 0인 부분은 공백으로 바꾼 문자열을 만든다.
2진수 계산을 한 문자열의 길이를 n으로 맞추기 위해 2진수 앞에 0을 추가하는 작업을 해준다.
→ 코드의 2번 작업
전체 for문 : O(n)
OR 연산으로 이진 문자열 변환 + 길이 보정 + 문자 변환
Integer.toBinaryString(...) : O(log m)
String.format(...) : O(n)
binary.toCharArray() + StringBuilder 처리 : O(n)
최종 시간 복잡도 : O(n × (log m + n)) → O(n²) (n이 m보다 클 경우) → 즉, 실질적으로는 O(n²) 으로 수렴
import java.util.*;
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
for (int i = 0; i < n; i++) {
// 1. 2진수 OR 연산 - 둘 중 하나라도 1이면 1로 변환
String binary = Integer.toBinaryString(arr1[i] | arr2[i]);
//System.out.println((arr1[i] | arr2[i]) + " = " + binary);
// 2. 2진수 문자열을 n자리로 맞추기 (앞에 0으로 채움)
// "%ns": 공백으로 앞을 채워서 전체 문자열을 n자리로 만들어줌
binary = String.format("%" + n + "s", binary).replace(' ', '0');
// 3. 암호 만들기
StringBuilder code = new StringBuilder();
for (char c : binary.toCharArray()) {
code.append(c == '1' ? "#" : " ");
}
//System.out.println(code);
answer[i] = code.toString();
}
return answer;
}
}