csmoon1010의 SW 블로그

[200516] [1차]비밀지도 - 2018 KAKAO BLIND RECRUITMENT(level1) 본문

카테고리 없음

[200516] [1차]비밀지도 - 2018 KAKAO BLIND RECRUITMENT(level1)

csmoon1010 2020. 5. 16. 15:53

1. 문제이해

- arr1, arr2 : 지도 한 행의 벽, 공백 여부를 십진수로 나타낸 배열

- 벽 = 1 = "#", 공백 = 0 = " "으로 바꿔서 나타내기

 

2. 전략

(1) 이진수 변환 함수 : int[][] decToBin(int n, int[] arr)

- arr[i]가 1이 될 때까지 arr[i]%2의 값을 뒤에서부터 채워넣고 arr[i]/=2 수행

- 마지막 몫인 1 추가(단, arr[i] = 0으로 주어진 경우 제외!!)

- 앞에 남은 자리에 0으로 채워넣기

(2) 두 배열 겹치기 : 이중 for문 이용

- map1[i][j] == 0 && map2[i][j] == 0일 때는 공백을 추가, 아니면 "#"을 추가

 

3. 참고사항

- Integer 클래스의 진수 변환 함수 이용(단, String형태로 return) : Integer.toBinaryString(int i)

Integer.toBinaryString(int i); //2진수로 변환
Integer.toOctalString(int i); //8진수로 변환
Integer.toHexString(int i); //16진수로 변환

- 두 배열 겹치기 = 비트 연산자 OR과 같은 역할 --> 이진수변환과 연산을 한번에 처리할 수 있음

Integer.toBinaryString(arr1[i] | arr2[i]);

- String형태의 이진수 --> "#", " " : replaceAll("1", "#"), replaceAll("0", " ") 이용!!

 

4. 코드

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        for(int i = 0; i < n; i++)  answer[i] = "";
        //이진수 변환
        int[][] map1 = decToBin(n, arr1);
        int[][] map2 = decToBin(n, arr2);
        //두 배열 겹치기
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                if(map1[i][j]==0 && map2[i][j]==0)  answer[i]+= " ";
                else    answer[i]+= "#";
            }
        }
        return answer;
    }
    public int[][] decToBin(int n, int[] arr){
        int[][] result = new int[n][n];
        for(int i = 0 ; i < n; i++){
            int index = n-1;
            while(arr[i] > 1){
                result[i][index] = arr[i] % 2;
                arr[i] /= 2;
                index--;
            }
            if(arr[i] != 0) result[i][index] = 1;
            for(int j = 0; j < index; j++)  result[i][j] = 0;
        }
        return result;
    }
}

 

Comments