티스토리 뷰

프로그래머스 로고

 

2018년도 카카오 BLIND RECRUITMENT 문제입니다.

 

비밀지도

 

문제

 

지도 암호를 해독 할 수 있는 방법이 있다.

 

  1. 지도는 한 변의 길이가 n 인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
  2. 전체 지도는 두장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도1"과 "지도2"라고 하자. 지도1  또는 지도2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다.
    즉, 지도1과 지도2에서 모두 공백인 부분은 전체 지도에서 공백이다.
  3. "지도1" 과 "지도2"는 각각 정수 배열로 암호화되어 있다.
  4. 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0 으로 부호화 했을 때 얻어지는 이진수에 해당하는 값의 배열이다.

문제 설명

 

 

 

 

입력과 조건

 

입력 조건

 

 

 

 

 

 

출력 형식

 

원래의 비밀지도를 해독하여 "#", 공백으로 구성된 문자열 배열로 출력하라.

 

 

 

 

 

 

입출력 예제

 

입출력 예제
입출력 예제

 

 

 

 

 

 

시행착오

 

처음에는 Integer.toBinaryString() 메서드를 이용해서 문자열로 반환 받으면 각각 자리는 문자열 비교로 수행하려고 했다.

근데 지금 현재 숫자를 문자열로 변경해서 각각의 자리를 비교해서 문자열을 출력한다?

뭔가 되게 비효율적이라고 생각하게 되었다.

 

그래서 문제의 그림에서 "이진법" 이라는 힌트를 얻고 수학적으로 접근하게 되었다.

결국 이진법은 2로 꾸준히 나누면서 나오는 나머지라는 것을 알게 되었고 int 형으로 접근하게 되었다.

 

 

 

 

문제 풀이

 

코드 설명에 큰 틀을 보자면

 

  • 문자열 배열로 출력해야 하기 때문에 n번 반복문을 돌려준다.
  • 결국 지도1, 지도2 에서 해당 숫자를 이진법으로 나타내야 하므로 n번 만큼 2로 계속 나누기
  • StringBuilder로 문자열 붙이고 reverse

 

문제 설명은 주석과 함께 하겠습니다.

import java.util.*;

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        
        // 지도 한변의 크키 만큼 반복
        for(int i = 0 ; i < n; i++){
            StringBuilder sb = new StringBuilder();
            int a = arr1[i];
            int b = arr2[i];
            for(int j = 0; j < n; j++){		// 2진법 만들면서 검사
                if(a % 2 == 1 | b % 2 == 1){	// 비트연산
                    sb.append("#");
                } else {
                    sb.append(" ");
                }
                a = a/2;
                b = b/2;
            }
            sb.reverse(); 	// 문자열 거꾸로 변경
            answer[i] = sb.toString();
        }
        
        return answer;
    }
}

 

 

 

감사합니다.

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함