[자바코딩] print format 문

gnoesnooj·2021년 11월 9일

2018 카카오 블라인드 채용의 [1차] 비밀지도 문제이다.

접근

처음에 보니 OR 비트연산을 통해서 비밀지도를 해독한다는 사실을 알았고, 2진법으로 바꿔준 후 String으로 리턴하는 toBinaryString() 을 통해 접근했다.
이후에 replaceAll() 을 통해 1 -> #, 0-> 공백으로 출력하도록 했다.

나의 코드(1)

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[arr1.length];
        int [] tmpArr = new int[arr1.length];
        for(int i=0;i<arr1.length;i++){
            answer[i]=Integer.toBinaryString(arr1[i] | arr2[i]);
            answer[i]=answer[i].replaceAll("1","#");
            //answer[i]=answer[i].replaceAll("0"," "); Error ! , 첫 공백 미출력
        }
        
        return answer;
    }
}


이와 같은 답을 기대해야하는데...


32보다 작은 수의 경우 2^5자리에 0에 들어가지 않는 문제가 발생했다.

결국 n의 수에 맞춰서 부족한 자릿수에 0을 집어 넣는 방식으로 일단 해결했다.

나의 코드 (2)

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[arr1.length];
        int [] tmpArr = new int[arr1.length];
        for(int i=0;i<arr1.length;i++){
            answer[i]=Integer.toBinaryString(arr1[i] | arr2[i]);
            answer[i]=answer[i].replaceAll("1","#");
            answer[i]=answer[i].replaceAll("0"," ");
            if(answer[i].length() !=n){
                while(answer[i].length() < n)
                answer[i]=" "+answer[i];
            }
        }

        return answer;
    }
}

그렇게 찝찝함을 느끼면서 실행을 해보니 일단 답안은 맞았지만, 다른 사람의 풀이를 보았다.

다른사람 풀이

for (int i = 0; i < n; i++) {
	result[i] = String.format("%" + n + "s", result[i]);
	result[i] = result[i].replaceAll("1", "#");
	result[i] = result[i].replaceAll("0", " ");
}

format() 이 있었다. 종종 Cprintf() 처럼 사용이 가능했던 System.out.format()format() 이였다.

자리수에 맞게 출력이 가능하게 해주는 것에 대해 생각을 했고, format()을 떠올리긴 했으나 저런식으로 %s 사이에 n을 통해서 접근이 가능하다는 것은 생각치 못했다.
사실 이렇게 결과를 보고 나니, 한번 더 생각을 했다면 시도하여 저렇게 풀어낼 만 했을 것 같은데, 생각을 더 깊이 하지 않았던 것 같아 살짝 아쉬움이 남았다.

느낀 점

한번 더 생각해보기, 안 될 거 같다고 생각하지 말고 시도라도 해볼 것.

profile
누구나 믿을 수 있는 개발자가 되자 !

0개의 댓글