본문 바로가기
알고리즘/코딩 테스트 문제

[프로그래머스] [1차] 비밀지도(Java)

by 진진리 2023. 10. 11.
728x90
class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] temp = new String[n];
        String[] answer = new String[n];
        
        for(int i=0;i<n;i++){
            temp[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }
        
        for(int i=0;i<n;i++){
            answer[i]="";
            for(int j=0;j<n-temp[i].length();j++){
                answer[i] += " ";
            }
            for(int j=0;j<temp[i].length();j++){
                if(temp[i].charAt(j)=='1') answer[i] += '#';
                else answer[i] += " ";
            }
        }
        
        return answer;
    }
}

어려웠던 점:

1. 자바는 익숙하지 않아서 처음에는 비트연산을 생각하지 못했다.

arr1과 arr2의 각 요소를 2진수로 변환한 뒤 둘 중 하나라도 1이면 '#'이어야 하므로 or연산(|)을 사용

Integer.toBinaryString()을 이용해 String 변수인 temp에 대입

2. temp에 대입하는 2진수는 앞의 0을 생략한다.

따라서 남는 길이만큼 미리 answer에 공백을 삽입해준다.

 

 

- 다른 사람의 풀이 참고

 

내용은 비슷하지만 String.format과 replaceAll 등의 함수를 사용함

  • String.format(): 문자열의 형식 지정 - C의 sprintf와 비슷한 듯

String str = String.format("%format", 변수);

format로 지정할 수 있는 형식: 정수, 문자, 16진수, 8진수, 문자열, 부동소수점, 날짜 등...

-> 위 문제에서 2진수를 n개의 문자열로 바꿀 때 사용

  • String replaceAll(String 대상, String 변환할문자)

-> 위 문자에서 1을 #으로, 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;
    }
}

String.format("%" + n + "s", result[i]); 을 제외하면 시간이 향상됨

->

temp = String.format("%16s", Integer.toBinaryString(arr1[i] | arr2[i]));
temp = temp.substring(temp.length() - n);

n이 16이하라는 조건에 의해 길이 16만큼으로 변환한 뒤 잘라줌