https://school.programmers.co.kr/learn/courses/30/lessons/17681
이번에 풀어볼 문제는 비밀지도 문제이다.

문제의 조건은 다음과 같다.
여기서 주의깊게 봐야 하는 것은 2번의 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분 을 봐야 한다.
해당 조건은 or 연산을 해야한다는 것을 의미한다.
그림으로 표현하자면 다음과 같다는 것을 알 수 있다.



- 일단 먼저 10진수의 수를 2진수로 변경하는 로직이 필요하다.
Java에서는 10진수를 여러 형태의 숫자로 변경하는 메서드를 제공한다.
이번에 사용할 메서드는 Integer.toBinaryString() 으로 해당 메서드를 통해 10진수 숫자를 2진수 String 형태로 변환할 수 있다.
변수 n의 길이만큼 배열 arr의 길이가 결정되니 반복문을 사용하여 해당 수를 변환하면 된다.
for (int i = 0; i < n; i++) {
// 1. arr1[i], arr2[i]를 2진수 문자열로 변환
String binary1 = Integer.toBinaryString(arr1[i]);
String binary2 = Integer.toBinaryString(arr2[i]);
}
- 2진수 String으로 변환 했다면 전체적인 길이를 맞춰줘야 한다.
전체적인 길이를 맞추지 않는 경우를 생각해보자
arr1[0]은 9이고, 9를 2진수로 바꾸게 된다면 1001(2)가 된다.
arr2[0]은 30이고, 30을 2진수로 바꾸게 된다면 11110(2)가 된다.
이렇게 전체적인 길이가 일치하지 않는다면 n의 길이만큼 반복하여 비교할 때 길이가 맞지 않게되고 IndexOutOfBoundsException 오류가 발생할 가능성이 높다.
// 2. n 길이에 맞춰 앞에 0 채우기
binary1 = String.format("%" + n + "s", binary1).replace(' ', '0');
binary2 = String.format("%" + n + "s", binary2).replace(' ', '0');
String.format(%ns, binary1)는 n만큼의 길이로 String의 길이를 변경하는 방식이며
replace(' ','0') 은 공백을 0으로 변경한다는 의미다.
그럼 1001을 5자리로 변경해도 10010이 아닌가?
싶은 의문이 들긴하는데 기본적으로 앞부터 공백으로 전환하기 때문에 01001(2)로 변경된다는 것이다.
- or연산
이제 2진수로 변경하고, 문자열의 길이도 맞췄으니 각 지도에 따라 or연산만 하면 된다.
나는 빠른 문자열 연산을 위해 StringBuilder를 사용할 예정이다.
// 3. StringBuilder를 사용하여 OR 연산 수행
StringBuilder sb = new StringBuilder();
for (int j = 0; j < n; j++) {
if (binary1.charAt(j) == '1' || binary2.charAt(j) == '1') {
sb.append("#"); // 하나라도 1이면 벽
} else {
sb.append(" "); // 둘 다 0이면 공백
}
}
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. arr1[i], arr2[i]를 2진수 문자열로 변환
String binary1 = Integer.toBinaryString(arr1[i]);
String binary2 = Integer.toBinaryString(arr2[i]);
// 2. n 길이에 맞춰 앞에 0 채우기
binary1 = String.format("%" + n + "s", binary1).replace(' ', '0');
binary2 = String.format("%" + n + "s", binary2).replace(' ', '0');
// 3. StringBuilder를 사용하여 OR 연산 수행
StringBuilder sb = new StringBuilder();
for (int j = 0; j < n; j++) {
if (binary1.charAt(j) == '1' || binary2.charAt(j) == '1') {
sb.append("#"); // 하나라도 1이면 벽
} else {
sb.append(" "); // 둘 다 0이면 공백
}
}
// 4. 결과 저장
answer[i] = sb.toString();
}
return answer;
}
}