본문 바로가기

Coding Test/프로그래머스

[프로그래머스/자바] [1차] 비밀지도

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        for(int i=0; i<n; i++){
            String str1 = Integer.toBinaryString(arr1[i]);
            String str2 = Integer.toBinaryString(arr2[i]);
            
            str1 = "0".repeat(n-str1.length())+str1;
            str2 = "0".repeat(n-str2.length())+str2;
            
            StringBuilder sb = new StringBuilder();
            for(int j=0; j<str1.length(); j++){
                if(str1.charAt(j) == '1' || str2.charAt(j) == '1'){
                    sb.append("#");
                } else sb.append(" ");
            }
            answer[i] = sb.toString();
        };
        return answer;
    }
}

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

      for(int i = 0 ; i < n ; i++){
          temp = String.format("%16s", Integer.toBinaryString(arr1[i] | arr2[i]));
          temp = temp.substring(temp.length() - n);
          temp = temp.replaceAll("1", "#");
          temp = temp.replaceAll("0", " ");
          answer[i] = temp;
      }

      return answer;
  }
}

풀이2(다른 분의 풀이)

- 배열의 정수는 최대 16의 길이를 가지고 있다.(입력 형식 중 n은 1 이상 16 이하) 따라서 or 연산으로 BinaryString으로 변환한 값을 16자로 받은 뒤 substring으로 잘라주었다. "%"+n+"s" 방식보다 빠르다고 한다!

- StringBuilder를 사용할 필요 없이 replaceAll 만으로 답을 만들어냈다.


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

위의 풀이2를 참고하여 다시 풀어보았다. 풀이2에 비해 느린 테스트도 있지만 비교적 시간대가 안정적으로 나왔다.