2018 카카오 블라인드 채용의 [1차] 비밀지도 문제이다.
처음에 보니 OR 비트연산을 통해서 비밀지도를 해독한다는 사실을 알았고, 2진법으로 바꿔준 후 String으로 리턴하는 toBinaryString() 을 통해 접근했다.
이후에 replaceAll() 을 통해 1 -> #, 0-> 공백으로 출력하도록 했다.
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[arr1.length];
int [] tmpArr = new int[arr1.length];
for(int i=0;i<arr1.length;i++){
answer[i]=Integer.toBinaryString(arr1[i] | arr2[i]);
answer[i]=answer[i].replaceAll("1","#");
//answer[i]=answer[i].replaceAll("0"," "); Error ! , 첫 공백 미출력
}
return answer;
}
}

이와 같은 답을 기대해야하는데...

32보다 작은 수의 경우 2^5자리에 0에 들어가지 않는 문제가 발생했다.
결국 n의 수에 맞춰서 부족한 자릿수에 0을 집어 넣는 방식으로 일단 해결했다.
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[arr1.length];
int [] tmpArr = new int[arr1.length];
for(int i=0;i<arr1.length;i++){
answer[i]=Integer.toBinaryString(arr1[i] | arr2[i]);
answer[i]=answer[i].replaceAll("1","#");
answer[i]=answer[i].replaceAll("0"," ");
if(answer[i].length() !=n){
while(answer[i].length() < n)
answer[i]=" "+answer[i];
}
}
return answer;
}
}
그렇게 찝찝함을 느끼면서 실행을 해보니 일단 답안은 맞았지만, 다른 사람의 풀이를 보았다.
for (int i = 0; i < n; i++) {
result[i] = String.format("%" + n + "s", result[i]);
result[i] = result[i].replaceAll("1", "#");
result[i] = result[i].replaceAll("0", " ");
}
format() 이 있었다. 종종 C 의 printf() 처럼 사용이 가능했던 System.out.format()의 format() 이였다.
자리수에 맞게 출력이 가능하게 해주는 것에 대해 생각을 했고, format()을 떠올리긴 했으나 저런식으로 %s 사이에 n을 통해서 접근이 가능하다는 것은 생각치 못했다.
사실 이렇게 결과를 보고 나니, 한번 더 생각을 했다면 시도하여 저렇게 풀어낼 만 했을 것 같은데, 생각을 더 깊이 하지 않았던 것 같아 살짝 아쉬움이 남았다.
한번 더 생각해보기, 안 될 거 같다고 생각하지 말고 시도라도 해볼 것.