코딩테스트/Java

(2018 카카오) [1차] 비밀지도 Java

SK_MOUSE 2020. 12. 28. 16:56
반응형

https://programmers.co.kr/learn/courses/30/lessons/17681

Java에서 10진수를 2진수로 변환하는 방법이 포함되어있다.

 

진수변환 관련 내용은 아래 글 참고.

donggov.tistory.com/48

 

자바 10진수 <-> 2진수, 8진수, 16진수 변환

자바 2진수, 8진수, 16진수 변환 시에는 Integer 클래스 API를 활용하면 편하다. (참고 : https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html) 10진수 -> 2진수, 8진수, 16진수 변환 1 2 3 4 5 6..

donggov.tistory.com

String 이진수 = Integer.toBinaryString(십진수값);

 

아래는 본인의 코드이다.

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        //지도 #
        String[] map = new String[n];
        for (int i = 0; i < n; i++) {
            String val1 = Integer.toBinaryString(arr1[i]);
            String val2 = Integer.toBinaryString(arr2[i]);

            //자리수 맞추기
            while(val1.length()<n){
                val1 = '0' + val1;
            }
            while(val2.length()<n){
                val2 = '0' + val2;
            }



            //0이면 공백, 하나라도 1이면 #
            map[i]="";
            for (int k = 0; k < n; k++) {
                if (val1.charAt(k) == '0' && val2.charAt(k) == '0') {
                    map[i] += " ";
                } else {
                    map[i] += "#";
                }
            }
        }

        return map;
    }
}

map배열을 map[i]=""; 로 초기화하지 않으면 null값이 출력되어서 초기화를 진행했다.

 

자리수를 맞추는 방법으로 필자는 length()를 비교하여 반복문을 통해 0을 채워주는 방식으로 구현했다.

 

 

다른 코드에는 채워주는 방식, 비교하는방식이 달랐다.


다른 코드를 살펴보겠다.

class Solution {
  public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] result = new String[n];
        for (int i = 0; i < n; i++) {
            result[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }

        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", " ");
        }

        return result;
    }
}

우선 첫번째 for문에서 바로 arr1[i] | arr2[i] 한 값을 OR연산자로 비교하면 2진수단위로 비교된다.

=> 원본 arr들간의 앞자리가 0이어서 비는 부분이 어느정도 보완된다.

=> 단, 테스트케이스2번의 6자리이지만 각각 5자리인(10110 | 01110)값은 결과값도 5자리이다.

 

 

=> 그래서 보완하는 점이 format이다.

두번째로 String.format()에 관한 부분이다.

result[i]의 형태를 "%5s"로 설정하면 그보다 작을경우 앞에 공백을 넣는다.

 

따라서

1) 어차피 공백인 부분은 치환안해도 공백이므로 내비둬도 된다.

2) OR연산자 값이 "0"으로 나온 부분은 공백으로 바꾸어야 하므로 replaceAll 메소드를 이용한다.

 

3) "#"으로 바꿔야하는 "1"부분도 2) 시행과 마찬가지 방법이다.

자세한 이론설명은..

format은 아래 링크를 참고하면 될 것 같다.

blog.jiniworld.me/68

 

[Java] String.format 을 이용한 문자열 형식 설정하기

public static String format(String format, Object... args); public static String format(Locale l, String format, Object... args); String 의 static 메서드인 format 메서드는 문자열의 형식을 설정하는..

blog.jiniworld.me

 

반응형