Programmers/JAVA

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

giggs 2023. 1. 6. 12:51

 

1. 문제 설명

 

 

 

 


 

 

2. 문제 풀이 핵심이라 생각하는 점

  • 2진수 변환 개념
  • 2개의 지도에서 1개라도 막혀있으면 #으로 표시
  • 막혀있는 기준은 2진수로 표현하였을 시 그 칸의 값이 1이라면 막혀있다고 표시됨
  • 즉, 해당 자리 수의 값을 2로 나눈 나머지가 0이 아니라면 막혀있는 것(#)이라고 이라고 판단해서 풀이함

 

 


 

 

3. 정답 코드 확인 및 활용 메소드 체크

 

 

3-1 : 정답 코드 확인

  • StringBuilder.append() : 사용했더니 기본 문자열의 뒤로 붙여지는 문제점 만남
  • StringBuilder.insert(index, value)를 사용하여서 해결

 

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        
        String[] answer = new String[n];
	    StringBuilder temp = new StringBuilder();
	    
	    
	    for (int i = 0; i < n; i++) {
        	//2개의 지도에서 모두 막혀있지 않다면 " " 하나라도 막혀있다면 "#"
            //StringBuilder.insert() 로 문자열 뒤쪽이 아닌 앞쪽으로 추가(자릿수 이동)
			for(int j=0; j<n; j++) {
		    	if(arr1[i]%2 == 0 && arr2[i]%2 == 0) {
		    		arr1[i] /= 2;
		    		arr2[i] /= 2;
		    		temp.insert(0," ");
		    	}else { 
		    		arr1[i] /= 2;
		    		arr2[i] /= 2;
		    		temp.insert(0,"#");
		    	}
	    	}
            
	    	//i의 수 만큼 반복하여 추가 + StringBuilder 초기화
			answer[i]=temp.toString();
			temp.setLength(0);
        }
           
        return answer;
    }
}

 

 


 

 

3-2 : 활용 메소드 체크

  • StringBuilder.insert(index, value) : 지정한 위치에 문자열을 추가 ( 추가할 위치의 값은 0부터 시작 )
  • StringBuilder.toString() : StringBuilder의 값을 String으로 변환

 

 


 

 

4. 공부하고 싶은 다른 분의 풀이

  • 재귀 함수와 비트 연산을 활용하여 풀이하셨다.
  • 재귀 함수는 언제 봐도 어렵고..
  • 비트 연산에 대해서는 공부해 보아야겠다.

 

 

class Solution {
    public String makeSharp(int n, int m) {
        if(n == 0) {
            if( m > 0) {
                String str = "";
                for(int i = 0; i < m; i++) {
                    str += " ";
                }
                return str;
            }
            else return "";
        }
        else {
            return n % 2 == 0 ? makeSharp(n/2, m-1) + " " : makeSharp(n/2, m-1) + "#"; 
        }
    }
    
    public String[] solution(int n, int [] arr1, int [] arr2) {
        String [] answer = new String[n];
        int [] secretMap = new int[n];
        for(int i = 0; i < n; i++) {
            secretMap[i] = arr1[i] | arr2[i];
            answer[i] = makeSharp(secretMap[i], n);
        }
        return answer;
    }
}