[java] 프로그래머스 - 비밀지도
업데이트:
문제
프로그래머스-비밀지도
두 개의 숫자배열을 받아서 2진수로 변환해 지도를 만든 다음, 통합 지도로 만들어서 출력하는 문제
-
제한 사항
지도의 한변의 크기 n 은 1이상 16 이하다
arr1, arr2는 길이 n인 정수배열로 주어진다
정수 배열의 각 원소x를 이진수로 변환했을 때의 길이는 n 이하다 -
예시
풀이
숫자가 들어오면 2진수로 변환한다
만일 자리수가 n보다 작다면, 앞에 0을 부족한 자리만큼 붙여준다
이진수 변환 시 1001₂ 이고 n=5라면 “01001”로 만든다
arr1로 만든 지도, arr2로 만든 지도를 각각 A, B 라고 할때
A칸에 벽인 부분은 B에서 공백이더라도 벽으로 처리된다
A[i][j] AND B[i][j] 라고 할 수 있다
arr1과 arr2에서 각 숫자를 n 자리에 맞춰 이진수로 변환한 것을 반복하면서
0인 자리는 그냥 두고, 1인 자리를 벽으로 처리하면
통합된 지도를 얻을 수 있다
소스코드
import java.util.*;
class Solution {
static boolean map[][];
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
map = new boolean[n][n];
char c[] = null;
mapChecking(arr1, n);
mapChecking(arr2, n);
StringBuilder sb;
for (int i = 0; i < n; i++) {
sb = new StringBuilder();
for (int j = 0; j < n; j++) {
sb.append(map[i][j] ? "#" : " "); // 통합지도를 돌면서 벽은 #, 공백은 공백처리
}
answer[i] = sb.toString();
}
return answer;
}
private void mapChecking(int[] arr, int n) {
char c[] = null;
for (int i = 0; i < arr.length; i++) {
String b = Integer.toBinaryString(arr[i]); // 숫자를 이진수 문자열로 만든다
if (b.length() < n) { // 길이가 부족하다면
c = new char[n];
for (int j = 0; j < n - b.length(); j++) {
c[0] = '0'; // 앞에 0을 붙여줌
}
for (int j = n - b.length(); j < c.length; j++) {
c[j] = b.charAt(-n + b.length() + j); // 나머지는 이어서 붙여준다
}
} else {
c = b.toCharArray();
}
for (int j = 0; j < c.length; j++) {
if (c[j] == '1') {
map[i][j] = true;
}
}
}
}
}
다른사람의 코드
비트연산자 (|)를 사용해 쉽게 변환하는 방법
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] result = new String[n];
for (int i = 0; i < n; i++) {
result[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
}
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", " ");
}
return result;
}
}
댓글남기기