
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17681
📚 문제

💻 입출력 형식

💡 아이디어
✅ 0(False) | 0(False) = 0(False), 0(False) | 1(True) = 1(True), 1(True) | 1(True) = 1(True)
'지도 1 또는 지도 2 중 어느 하나라도 벽(1)인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백(0)인 부분은 전체 지도에서도 공백이다.'를 수식으로 표현해보면 위와 같이 |(or)을 사용하는 식이 만들어집니다.
✅ Integer.toBinaryString(int i)를 활용합니다.
✨ 잠깐, Integer.toBinaryString(int i)는 어떻게 사용하는건지 궁금하신가요?
String toBinaryString(int i)
- Integer.toBinaryString() 함수는 정수를 2진수 문자열로 변환하는 함수입니다.
- 비트 연산자를 사용하여 두 숫자의 비트 연산 결과를 구한 후, 그 결과를 함수의 매개변수로 전달할 수 있습니다.
✅ 2진수로 변환된 String 값 앞에 0을 붙여 길이가 n이 되도록 변환합니다.
str = "0".repeat(n - str.length()) + str;
str = String.format("%16s", Integer.toBinaryString(arr1[i] | arr2[i]));str = str.substring(str.length() - n);
위와 같은 여러가지 방법들이 있습니다.
추가하자면, 두 번째 방법의 경우 "%16s"인 이유는 n의 최댓값이 16이기 때문입니다.
따라서 최댓값만큼 설정해놓고, 나머지 공간을 0으로 채운 후 다시 n의 정확한 크기에 맞게 문자열을 자르는 방식입니다.
❓ 두 방식의 성능 차이가 궁금하신가요?


두 번째 방법의 성능이 조금 더 좋은 것을 확인하실 수 있습니다.
✅ '0'의 자리에 ' '을, '1'의 자리에 '#'을 채워넣습니다.
answer[i] = str.replace("0", " ");answer[i] = answer[i].replace("1", "#");
❓ replace와 replaceAll 둘 다 사용 가능한가요?
replaceAll을 사용해도 괜찮습니다.
덧붙이자면 replace와 replaceAll의 차이는, replaceAll은 regex 부분에 '정규 표현식'을 사용할 수 있다는 것입니다.
다만 지금의 풀이법에서는 정규 표현식을 사용하지 않기 때문에 replace로 작성했습니다.
replaceAll로 작성해도 같은 결과가 도출됩니다.
👩🏻💻 Java 풀이
class Solution { public String[] solution(int n, int[] arr1, int[] arr2) { String[] answer = new String[n]; for(int i = 0; i < n; i++) { String str = Integer.toBinaryString(arr1[i] | arr2[i]); str = "0".repeat(n - str.length()) + str; answer[i] = str.replaceAll("0", " "); answer[i] = answer[i].replaceAll("1", "#"); } return answer; }}
🎨 다른 풀이
class Solution { public String[] addZero(String bin, int n) { if(bin.length() != n) { String zero = ""; for(int i=0; i<n-bin.length(); i++) { zero += "0"; } bin = zero + bin; } return bin.split(""); } public String[] solution(int n, int[] arr1, int[] arr2) { String[] answer = new String[n]; for(int i=0; i<n; i++) { String row = ""; String bin1 = Integer.toBinaryString(arr1[i]); String bin2 = Integer.toBinaryString(arr2[i]); String[] a1 = addZero(bin1, n); String[] a2 = addZero(bin2, n); for(int j=0; j<n; j++) { if("1".equals(a1[j]) || "1".equals(a2[j])) row += "#"; else row += " "; } answer[i] = row; } return answer; }}
class Solution { public static String cal(int n,int len){ String str=""; while(n != 0){ str = n%2 + str; n/=2; } while(str.length() != len){ str = "0"+str; } return str; } public String[] solution(int n, int[] arr1, int[] arr2) { String[] answer = new String[n]; for(int i =0;i<n;i++){ String str_x,str_y,str=""; int x = arr1[i]; int y = arr2[i]; str_x = cal(x,n); str_y = cal(y,n); for(int j = 0;j<n;j++){ if(str_x.charAt(j) == '1' || str_y.charAt(j) == '1') str+="#"; else str+=" "; } answer[i] = str; } return answer; }}
import java.util.*;class Solution { public static String Change(int num, int n){ String temp = String.format("%16s",Integer.toString(num, 2)); return temp.substring(temp.length() - n); } public String decode(String a, String b, int n){ StringBuffer sb = new StringBuffer(); for(int i = 0; i < n; i++){ if(a.charAt(i) == '1' || b.charAt(i) == '1'){ sb.append("#"); } else{ sb.append(" "); } } return sb.toString(); } public String[] solution(int n, int[] arr1, int[] arr2) { String[] answer = new String[n]; ArrayList<String> a1 = new ArrayList<>(); ArrayList<String> a2 = new ArrayList<>(); for(int i = 0; i < arr1.length; i++){ a1.add(Change(arr1[i], n)); a2.add(Change(arr2[i], n)); } for(int i = 0; i < arr1.length; i++){ answer[i] = decode(a1.get(i), a2.get(i), n); } return answer; }}
🔗 참고 링크
※ 끝까지 봐주셔서 감사합니다. 오류에 대한 지적은 언제나 환영입니다😊