알고리즘/카카오 모의고사

2018 Kakao Blind Recruitment: [1차] 비밀지도

문괜 2024. 8. 12. 12:00
반응형

문제 유형 : 구현

소요 시간:  20분(+-5분)

 

작성 코드

1차 구현

class Solution {
    public String lengthCheck(int n, String given) {
        if (given.length() < n) {
            int gap = n - given.length();
            return "0".repeat(gap) + given;
        }
        return given;
    }
    
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        for (int i = 0; i < n; i++) {
            StringBuilder row = new StringBuilder();
            int arr1Num = arr1[i];
            int arr2Num = arr2[i];
            String arr1binary = lengthCheck(n, Integer.toBinaryString(arr1Num));
            String arr2binary = lengthCheck(n, Integer.toBinaryString(arr2Num));
            for (int j = 0; j < n; j++) {
                // 0 0
                if (arr1binary.charAt(j) == '0' && arr2binary.charAt(j) == '0') {
                    row.append(' ');
                    continue;
                }
                // 1 1, 1 0, 0 1
                row.append('#');
            }
            answer[i] = row.toString();
        }
        return answer;
    }
}

 

2차 구현

class Solution {
    public static String decToBinary(int num, int n) {
        StringBuilder binString = new StringBuilder();
        for (int i = n - 1; i >= 0; i--) {
            int k = num >> i;
            binString.append(((k & 1) > 0)?1:0);
        }
        return binString.toString();
    }

    public static String secretMapGen(String bin1, String bin2,int n) {
        StringBuilder row = new StringBuilder();
        for (int i = 0; i < n; i++) {
            if (bin1.charAt(i) == '0' && bin2.charAt(i) == '0') row.append(" ");
            else row.append("#");
        }
        return row.toString();
    }

    public static String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        for (int i = 0; i < n; i++) {
            answer[i] = secretMapGen(
                    decToBinary(arr1[i], n),
                    decToBinary(arr2[i], n),
                    n
            );
        }
        return answer;
    }
}

 

접근 방식

1차 구현

  1. 10진법을 2진법으로 만들고 2진번을 비교해 둘다 0이 아니면 무조건 #을 집어 넣었다.
  2. 10진법을 2진법으로 만드는 내장함수를 사용했다. -> Integer.toBinaryString(int)
    1. 중요한 사실은 실제 상황에서는 사용하지 못할 거 같다. 단지 JetBrains의 추천이었다.
  3. 이진법의 길이가 주어진 n의 길이보다 클수는 없지만 작을 수는 있기에 길이를 확인하는 함수를 구현하였다.

2차 구현 

  1. 1차 구현과 같은 로직을 사용하였으나 다시 풀면서 Integer.toBinaryString() 생각나지 않았다.
  2. 그래서 byte를 비교하는 방식으로 2진법으로 바꾸었다. 의외로 이진수의 길이를 정해 줄 수 있어 1차 구현과 같은 길이 검사 함수가 필요 없었다.

개선 사항

  • 결론적으로 1차 구현 2차 구현 둘다 n^2이다 하지만 1차구현과 2차구현을 조합하면 n과 근사치로 가능할 수 있겠다는 생각이 들어 도전해 볼만하다고 본다. 하지만 n^2도 통과를 하는걸 보니 문제의 의도인가도 싶다.
반응형

'알고리즘 > 카카오 모의고사' 카테고리의 다른 글

2018 카카오 BLIND RECRUITMENT 캐시  (1) 2024.08.30