[JAVA-3]프로그래머스 1단계 - 비밀 지도

이지연·2020년 11월 8일
0

[JAVA]프로그래머스

목록 보기
3/9
post-thumbnail

https://programmers.co.kr/learn/courses/30/lessons/17681

비밀지도
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.



코드

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2){
    	String[] answer = new String[n]; ---(1)
        
    	for(int i = 0; i<n; i++){ ---(2)
    		answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
    	}
    	
       for(int i = 0; i<n; i++) { ---(3)
    	   answer[i] = String.format("%"+n+"s", answer[i]);
    	   answer[i] = answer[i].replace("1","#");
    	   answer[i] = answer[i].replace("0"," ");

    	   System.out.println(answer[i]);
       	}
        	return answer;
    }
}

풀이 과정

(1) 문제를 보면 기댓값 〉 ["#####", "# # #", "### #", "# ##", "#####"] 이다. 그렇기 때문에 배열로 만들어주었다.

(2) Integer.toBinaryString()를 이용해 2진법으로 변환해주는데 arr1과 arr2를 비트 논리 연산자 or를 이용하였다.
*or연산자(|) : 두 값 중 하나라도 1이면 1, 두 값 모두 1이면 0으로 처리

(3) for문을 돌리는데,

  • String.format()을 이용해 n개의 자릿수, 즉 5만큼 문자열 담는데, 부족하면 0으로 자릿수를 채워주도록 했다.
  • replace()를 이용해 1이면 "#"으로 , 0이면 " " 으로 대체해주었다.

실패한 thinking 코드

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = {};
        
        for(int i = 0; i<n; i++){
        	System.out.println(i+"번째");
        	
            String arr_one = Integer.toBinaryString(arr1[i]);  ---(1)
            String arr_two = Integer.toBinaryString(arr2[i]);
            
            int len = arr_one.length();
            int len2 = arr_two.length();
            
            if(len<n) {
            	for(int j = 0; j<n-len-1; j++) {
            		arr_one = "0" + arr_one;
            	}
            }
           
            if(len2<n) {
            	for(int j = 0; j<n-len-1; j++) {
            		arr_two = "0" + arr_two;
            	}
            }
      
            System.out.println(arr_one);
            System.out.println(arr_two);
            
			}
    
        	return answer;
        }
  • Integer.toBinaryString()를 이용해서 각각 arr_one과 arr_two를 2진법으로 바꿔주었는데, 이후에 이진법 자릿수의 문제가 있었다.

  • 이진법으로 바꾼 자리수가 4이하인 것이 나왔다. 그래서 len의 개수만큼 for문을 이용해 "0"을 채워주려고 하였는데, 실패하였다.

  • 왜 실패하였는가?

비트 연산을 십진수 일때 해야한다!

나는 이진수 문자열로 바꾸고 할려해서 문제가 되었다.

(1)번을 보면 나는 이진수로 만들기 위해서 문자열로 만들었다.

그런데, 이진수 00110 이렇게 바꾸려고 연산을 하려 했는데 이진수가 아니라 문자열 "00110"이라고 바꿔진 것이다. 그렇게 되면 다음에 비트 연산자인 or을 못한것이 문제였다.

이진수나 십진수나 모두 숫자지만, 문자열은 아예 다른것이기 때문에 비트 연산 자체가 불가능하다.

그래서 아래의 코드를 고쳐보았다.

코드 수정

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        
        for(int i = 0; i<n; i++){
        	
            String arrs = Integer.toBinaryString(arr1[i] | arr2[i]);  --(1)
            
            int len = arrs.length();  ---(2)
            
            if(len<n) {  ---(3)
            	for(int j = 0; j<n-len; j++) {
            		arrs = "0" + arrs;
            	}
            }  
            answer[i] = arrs;   ---(4)
		}
        
        for(int i=0; i<n; i++) {    ---(5)
        	answer[i] = answer[i].replace("1", "#");
        	answer[i] = answer[i].replace("0", " ");
        }
    	return answer;
    }

(1) Integer.toBinaryString()를 이용해 2진법으로 변환해주는데 arr1과 arr2를 비트 논리 연산자 or를 이용

(2) len변수에 arrs의 길이를 대입

(3) len의 길이가 n보다 작으면 n-len만큼 for문을 돌리면서 앞에 0을 채우도록 한다.

(4) answer[i]에 arrs를 대입

(5) "1" -> "#", "0" -> " "으로 만들어주기 위해 replace()를 사용

profile
Everyday STEP BY STEP

0개의 댓글