[프로그래머스,Level 1] 비밀지도(JAVA 구현)
코테/프로그래머스(Programmers)

[프로그래머스,Level 1] 비밀지도(JAVA 구현)

반응형

- 첫 풀이 및 정답풀이

  이 문제를 처음 풀 때 이진수를 변환하는 메서드의 존재에 대해서는 알고 있었지만, 찾아보지 않고 한 번 풀어본 뒤 관련 정보를 찾아 다시 풀어보고자 했다. 필자가 풀어본 방식은 지도의 한 줄에 해당하는 arr1,arr2의 정수를 추출해 직접 이진수로 변환해 풀어보고자 했다. 

 

class Solution {
    
    // 1. 이진수 변환 메소드 및 자리수 n에 맞게 0을 채우기.
    public static String cal(int n,int len){
        String str="";
        
        // 1-1. 이진수 변환.
        while(n != 0){
            str = n%2 + str;
            n/=2;
        }
        
        // 1-2. n 자릿수 채우기.
        while(str.length() != len){
            str = "0"+str;
        }
        
        return str;
    }
    
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n]; 
        
        // 2. 배열의 크기만큼 반복.
        for(int i =0;i<n;i++){
            // 2-1. 변환한 이진수 저장 변수 및 논리연산 결과 저장 변수.
            String str_x,str_y,str="";
            // 2-2. 각 배열에서 정수 저장.
            int x = arr1[i];
            int y = arr2[i];
            // 2-3. 이진수로 변환 및 자릿수 채우기.
            str_x = cal(x,n);
            str_y = cal(y,n);
            // 2-4. 조건에 맞게 문자열 포맷 변경.
            for(int j = 0;j<n;j++){
                if(str_x.charAt(j) == '1' || str_y.charAt(j) == '1') str+="#";
                else str+=" ";
            }
            // 2-5. 한 줄 완성.
            answer[i] = str;
        }
        
        return answer;
    }
}

  위 방식으로 풀었을 때 결과 시간은 아래와 같다.

  다음으로 인터넷에서 찾은 toBinaryString()을 이용해 간단하게 푸는 방법을 사용해 풀어 보았다.

class Solution {
       
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n]; 
                
        for(int i =0;i<n;i++){
            // 1. arr1과 arr2의 원소들을 이진수로 바꾼 뒤, or 비트 논리연산 수행.
            String str=Integer.toBinaryString(arr1[i] | arr2[i]);
            // 2. 5자리의 문자열 형태로 포맷변경, 5자리가 안되는 이진수의 나머지는 공백으로 채운다.
            str = String.format("%"+n+"s",str);
            // 3. 1->#, 0 -> 공백 으로 바꾼다.
            str = str.replaceAll("1" , "#");
            str = str.replaceAll("0" , " ");
            // 4. 한 줄 완성.
            answer[i] = str;
        }
        
        return answer;
    }
}

 

  코드 자체도 매우 간단하고, 실행 결과 역시 더 빠른 것을 확인할 수 있다. 이 문제를 통해 다시 기억해보아야 할 것은 2진수로 바꾸는 toBinaryString() ( 8진수,toOctalString/ 16진수, toHexString도 존재.)와 문자열의 포맷을 바꾸는 String.format(), 특정 문자를 다른 문자로 바꿔주는 replaceAll() 메서드이다.

반응형