본문 바로가기
휴지통/알고리즘 & 자료구조

비밀지도

by 신재권 2022. 10. 22.
package programmers;

public class 비밀지도 {

   //1. 지도는 한 변의 길이가 n인 정사각형 배열, ""과 "#" 두 종류로 이루어짐(공백, 벽)
   //2. 전체 지도는 두 장의 지도를 겹쳐서 얻음, 지도 1과 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서 벽이고, 지도1과 지도2에서 모두 공백인 부분은 전체 지도에서도 공백
   //3. 정수 배열
   //4. 암호화된 배열은 각 가로줄에서 벽부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열

   public static String[] solution(int n, int[] arr1, int[] arr2) {
      return int2DArrayToStringArray(sumMap(go(arr1), go(arr2)));
   }

   // int[][] -> String[]
   private static String[] int2DArrayToStringArray(int[][] map) {
      int len = map.length;
      String[] stringsMap = new String[len];
      for (int i = 0; i < len; i++) {
         StringBuilder sb = new StringBuilder();
         for (int j = 0; j < len; j++) {
            if (map[i][j] == 1) {
               sb.append('#');
            } else {
               sb.append(' ');
            }
         }
         stringsMap[i] = sb.toString();
      }
      return stringsMap;
   }

   // int[][] + int[][] = int[][]
   private static int[][] sumMap(int[][] map1, int[][] map2) {
      int len = map1.length;
      int[][] map = new int[len][len];
      for (int i = 0; i < len; i++) {
         for (int j = 0; j < len; j++) {
            if (map1[i][j] == map2[i][j]) {
               map[i][j] = map1[i][j];
            } else {
               map[i][j] = 1;
            }
         }
      }
      return map;
   }

   // int[] -> int[][]
   private static int[][] go(int[] arr) {
      int len = arr.length;
      int[][] map = new int[len][len];
      for (int i = 0; i < len; i++) {
         String tmp = toBinary(arr[i], len);
         for (int j = 0; j < len; j++) {
            if (tmp.charAt(j) == '1') {
               map[i][j] = 1;
            }
         }
      }
      return map;
   }

   // 2진수 얻어내기, if 조건문은 자릿수에 맞게 숫자 맞춰주기
   private static String toBinary(int num, int len) {
      StringBuilder sb = new StringBuilder();
      while (num > 0) {
         sb.append(num % 2);
         num /= 2;
      }
      if (sb.length() != len) {
         do {
            sb.append('0');
         } while (sb.length() < len);
      }
      return sb.reverse().toString();
   }

}

'휴지통 > 알고리즘 & 자료구조' 카테고리의 다른 글

문자열 내 마음대로 정렬  (0) 2022.10.29
최소직사각형  (0) 2022.10.23
시저암호  (0) 2022.10.20
예산  (0) 2022.10.20
백준 2003  (0) 2022.09.24