본문 바로가기
코딩테스트/programming_JAVA

[Java] 프로그래머스_17681 : [1차] 비밀지도

by prometedor 2023. 12. 17.

Integer.toBinaryString , replace, String.format 이용하기

[1차] 비밀지도 : Level1

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

처음 작성한 코드

import java.util.*;

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        String[] binArr1 = new String[arr1.length];
        String[] binArr2 = new String[arr2.length];
        String[] bin = new String[n];
        Arrays.fill(binArr1, "");
        Arrays.fill(binArr2, "");
        Arrays.fill(answer, "");

        for (int i = 0; i < n; i++) {
            binArr1[i] += Integer.toBinaryString(arr1[i]).toString();
            binArr2[i] += Integer.toBinaryString(arr2[i]).toString();
        }

        for (int i = 0; i < n; i++) {
            bin[i] = Integer.toBinaryString(Integer.parseInt(binArr1[i], 2) | Integer.parseInt(binArr2[i], 2));
        }

        for (int i = 0; i < n; i++) {
            while (bin[i].length() < n) {
                bin[i] = "0" + bin[i];
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < bin[i].length(); j++) {
                if (bin[i].charAt(j) == '1') {
                    answer[i] += "#";
                } else {
                    answer[i] += " ";
                }
            }
        }

        return answer;
    }
}

 

ㄴ 불필요한 배열 생성이 너무 많았다.

 

 

 

두 번째 작성한 코드

import java.util.*;

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

 

ㄴ 불필요한 배열을 제거하였다.

replace 를 이용하여 1 -> #, 0 -> 공백으로 변경 시켜주는 부분의 실행 시간을 약간 단축 시켰다.

 

 

 

세 번째 작성한 코드

import java.util.Arrays;

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];

        for (int i = 0; i < n; i++) {
            // 비트 연산 후 이진수로 변환
            String binStr = Integer.toBinaryString(arr1[i] | arr2[i]);
            
            // 부족한 길이만큼 앞에 0으로 채우기
            binStr = String.format("%" + n + "s", binStr).replace(' ', '0');
            
            // #과 공백으로 변환하여 answer에 저장
            answer[i] = binStr.replace('0', ' ').replace('1', '#');
        }

        return answer;
    }
}

 

부족한 길이만큼 앞에 0으로 채우기를 수행하는 부분의 코드를 String.format 을 이용하여 코드를 더욱 간결하게 만들었다.

String.format("%" + n + "s", binaryString)문자열을 지정된 길이(n)로 포맷팅하는데 사용된다. 여기서 %s는 문자열을 나타내는 포맷 지시자이다.

ㄴ 그런데, 실행 시간은 다소 증가하는 것을 확인하였다.

 

 

 


 

 

문제점 : 불필요한 배열과 반복문으로 인해 시간이 생각보다 많이 걸려서 리팩토링을 하고자했다.

해결 방법 : Integer.toBinaryString , replace, String.format 을 사용하여 코드를 간결하게 만들었다. 하지만 String.format 을 사용하면서 실행 시간이 늘어나서 다시 두 번째 코드로 제출 했다.

깨달은 바 : 불필요한 배열 생성은 하지 않는 것이 좋겠다. 반복문이 많아지지 않도록 간결한 코드를 작성하도록 해야겠다.

이 문제를 통해 String.format 에 대해 처음 알게 되었다. 가끔은 라이브러리를 사용하는 것 보다 무식하게 for 문을 사용하는 것이 시간 단축에 도움이 될 수도 있는 것 같다.