ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - Lv1. 비밀지도
    PS 2022. 3. 4. 12:54

    문제 : 비밀지도

    • 문제 내용은 여기.
    • 쉽게 말해, 두 개의 숫자 입력값을 각각 이진수로 전환하고, 이진수의 1을 #으로 치환한 뒤 결과물을 합치면 된다.

    풀이

    static int N;
    public String[] solution(int n, int[] arr1, int[] arr2) {
        N = n;
    
    //        String[] wall1 = intToWall(arr1);
    //        String[] wall2 = intToWall(arr2);
    //        return combineWall(wall1, wall2);
    
        return intToWall2(arr1, arr2);
    }
    
    private static String[] intToWall2(int[] arr1, int[] arr2) {
        String[] wallArr = new String[N];
        for (int i = 0; i < N; i += 1) {
            wallArr[i] = String.format("%" + N + "s", Integer.toBinaryString(arr1[i] | arr2[i]))
                    .replace("1", "#")
                    .replace("0", " ");
        }
        return wallArr;
    }
    
    private static String[] intToWall(int[] arr) {
        String[] wallArr = new String[N];
    
        for (int i = 0; i < N; i += 1) 
            wallArr[i] = String.format("%" + N + "s", Integer.toBinaryString(arr[i]))
                    .replace("1", "#")
                    .replace("0", " ");
    
        return wallArr;
    }
    
    private static String[] combineWall(String[] a1, String[] a2) {
        for (int i = 0; i < N; i += 1) {
            if (a1[i].equals(a2[i])) continue;
    
            for (int j = 0; j < N; j += 1) 
                if (a1[i].charAt(j) == ' ' && a2[i].charAt(j) == '#')
                    a1[i] = new StringBuilder(a1[i]).replace(j, j + 1, "#").toString();
        }
    
        return a1;
    }
    • 두 가지 방법으로 풀었다. 후기 참조.

    후기

    1 ) 첫번째 방식(intToWall(), combineWall())은 비트연산을 쓰기 싫어서(지나고 나서 보니 왜인가 싶지만 이미 코테를 4문제 정도 푼 뒤였기 때문에 제정신이 아니었다) 안 쓰고 풀어본 방식이다. 나쁘지 않게 작성한 것 같다.
    2 ) 두번째 방식(intToWall2())은 비트연산자 |(or)를 통해 평범하게 풀었다.

    댓글

Designed by Tistory.