코딩 테스트

(Java) 프로그래머스 비밀지도

로승리 2021. 11. 10. 05:14

문제를 읽고 어떻게 구현해야 할지 한참을 고민했다.

비트 연산을 까맣게 잊고 있었고 2차원 배열을 만들어서 해결하는 쪽으로 생각 했었는데

금방 막혀버리고 말았다. 2진수에 대해 찾아보다 비트 연산에 대해 알게 되었고

비트 연산을 이용하니 급 진전이 있었다.

 

다만 비트연산을 통해서 10을 2진수로 변환하게 되면 1010으로 결과가 나왔는데

문제를 해결하기 위해선 001010처럼 n에 맞게 앞에 0을 붙혀줘야했다.

여기도 꽤나 많은 시간을 또 썼고... StringBuilder의 insert를 통해서 해결했다.


최종코드

import java.util.Arrays;
class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] temp = new String[n];
        String[] answer = new String[n];
        StringBuilder sb1 = new StringBuilder();

        for (int i=0; i<n; i++) {
            // StringBuilder에 비트연산 값 설정
            StringBuilder sb2  = new StringBuilder(Integer.toBinaryString(arr1[i] | arr2[i]));

            // 앞에 0을 삽입해 자릿수 맞춰놓기
            while(sb2.length() != n) {
                sb2.insert(0, 0);
            }
            
            // temp 배열에 비트연산 결과 넣기
            temp[i] = sb2.toString();
        }

        for (int i=0; i< temp.length; i++) {
            for (int j=0; j< temp[i].length(); j++) {
                // temp 배열을 요소들 돌며 검사
                char ch = temp[i].charAt(j);
                if(ch == '1') {
                    sb1.append("#");
                }
                else {
                    sb1.append(" ");
                }
            }
            // answer 배열에 문자열 추가
            answer[i] = sb1.toString();
            // StringBuilder 초기화
            sb1 = new StringBuilder();
        }
        
        return answer;
    }
}

 

다른분 풀이

String.format을 이용해서 간단히 풀어냈다.

내 코드는 너무 쓸데없이 복잡하다고 느꼈는데 직관적으로 이해하기 쉬워 보인다.

잊지말고 다른 문제에 적용해 봐야겠다.

import java.util.Arrays;
class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];

        StringBuilder sb = new StringBuilder();

        // 비트연산
        for (int i=0; i<n; i++) {
            answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }

        for (int i=0; i<n; i++){
            // format을 이용해서 n만큼 자리수 설정
            answer[i] = String.format("%"+n+"s", answer[i]);
            answer[i] = answer[i].replace("1", "#");
            answer[i] = answer[i].replace("0", " ");
        }
        
        return answer;
    }
}