[java] 프로그래머스 - 비밀지도

1 분 소요

업데이트:

문제

프로그래머스-비밀지도
두 개의 숫자배열을 받아서 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;
    }
}

댓글남기기