728x90
링크 : 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;
}
}
🔗 참고 링크
※ 끝까지 봐주셔서 감사합니다. 오류에 대한 지적은 언제나 환영입니다😊
728x90