ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스 Level1][Java] 비밀지도
    Coding Test/Programmers 2021. 12. 8. 17:53

     

    비밀지도

    - 주어진 2개의 배열(arr1, arr2)를 겹쳐 벽(1) '#'으로 공백(0)은 ' '으로 치환하여 해석한 배열을 리턴하는 문제

     

    ※ 생각하기

    - 지도를 겹친다는 것은 각각의 배열 합친다는 것이다. 

    - 배열의 수들을 각각 이진수로 변환해야 한다.

    - 1은 벽을 0은 공백을 의미한다.

    - 해석된 배열에서 벽은 '#' 공백은 ' '이다.

     

    ※ 풀이법

    1) 변수 2개를 생성(temp, temp2)하고 Integer.toBinaryString()을 활용하여 이진수로 변환 한 값을 저장한다.

       이 때, 이진수로 변환된 숫자의 첫 번째 값이 0이면 0이 생략되는데 이를 위해 0을 앞에 더해줄 필요가 있다.

     

    2) 생략된 0을 더해주는 함수(addZero)를 만든다.

       이진수와 지도의 크기를 파라미터로 받아 해당 이진수의 길이가 지도의 크기보다 작을 때,

        while문을 활용하여 숫자 앞에 0을 붙여 리턴해준다.

     

    3) long 타입(int 타입일 시 에러가 발생)의 변수(sumTemp)를 생성하고 Long.parsLong()로 각 이진수를 long타입으로

       형변환하여 더해준 값을 해당 변수에 저장해준다.

     

    4) sumTep를 다시 String으로 형변환하여 result 변수에 담아준다.

       각 이진수를 더했을 때도 맨 앞의 수가 0일 경우 생략되므로 addZero 함수로 0을 붙여준다.

     

    5) replaceAll(), replace()로 result의 숫자들을 '#'과 ' '으로 변환한다.

       - replaceAll()은 정규식을 활용할 수 있어 1~9까지의 숫자를 모두 #으로 변환

         Why? 각 이진수를 더했을 때의 값의 각각의 자리는 1을 넘을 수 있다. 예를 들어 9(01001)과 30(11110)을 더했을 때

                 '12111'이 되는데 문제에서 1 = 벽, 0 = 공백이지만 1 이외의 다른 숫자에 대한 언급이 없다.

                 그래서 더한 수의 자리값이 1이 넘어버리면 그냥 벽이라고 생각하고 치환을 했다.

        - replace()로 0은 ' '으로 변환

     

    6) answer 배열에 하나씩 담아준 후 리턴한다.

     

    문제도 잘 이해되는 편이였고 보자마자 어떻게 풀어야 할지 딱 생각났던 문제였다.

    로직을 구현하고 결과 제출을 했을 때, 테스트에서 에러가 나서 뭐가 문젠지 질문하기를 들어가서 살펴봤는데 sumTemp의 타입이 문제였다. int 범위를 초과하는 케이스가 있다고한다.(어떨 때 인지는 잘 모르겠다..)

    이후 Long 타입으로 변환 후 제출하니 통과했다! 나름 재미있었던 문제였다.

     

    import java.util.Arrays;
    
    public class Solution {
    	// 결과 확인을 위함
    	public static void main(String[] args) {
    		Solution st = new Solution();
    		int n = 6;
    		int[] arr1 = {46, 33, 33 ,22, 31, 50};
    		int[] arr2 = {27 ,56, 19, 14, 14, 10};
    		System.out.println(Arrays.toString(st.solution(n, arr1, arr2)));
    	}
    	
    	public String[] solution(int n, int[] arr1, int[] arr2) {
            String[] answer = new String[arr1.length];
            
            for(int i=0; i<n; i++) {
            	// 값을 이진수로 바꾸기
            	String temp = Integer.toBinaryString(arr1[i]);
            	String temp2 = Integer.toBinaryString(arr2[i]);
            	// 생략된 0 추가(이진수로 바꾼 값의 맨 앞이 0이면 0이 생략됨)
            	temp = addZero(temp, n);
            	temp2 = addZero(temp2, n);
            	
            	// 이진수로 바꾼 두 변수를 더하기
            	long sumTemp = Long.parseLong(temp) + Long.parseLong(temp2);
            	// 더한 값을 String으로 변환
            	String result = String.valueOf(sumTemp);
            	
            	// 생략된 0 추가(더한 맨 앞의 수가 0이면 0이 생략됨)
            	result = addZero(result, n);
            	
            	// 정규식을 이용하여 문자가 1~9이면 #으로 치환, 0이면 공백으로 치환 
            	result = result.replaceAll("[1-9]", "#").replace("0", " ");
            	
            	// answer에 담기
            	answer[i] = result;
            }
            return answer;
        }
    	
    	// 생략된 0을 추가해주는 함수
    	public String addZero(String str, int length) {
    		if(str.length() < length) {
        		while(str.length() < length) {
        			str = "0" + str;
        		}
        	}
    		
    		return str;
    	}
    }
Designed by Tistory.