[프로그래머스](lv.1) 비밀지도(java)

0

코딩테스트

목록 보기
15/37
post-thumbnail

<문제>

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

<나의 풀이>

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        String[] arr1Binary = new String[n];
        String[] arr2Binary = new String[n];
        // 이진수로 바꿔주고 부족한 자리에 0채워주기
        for(int i=0; i<n; i++){
            String temp = Integer.toBinaryString(arr1[i]);
            while(temp.length()<n){
                temp = "0"+temp;
            }
            arr1Binary[i] = temp;
        }
        
        for(int i=0; i<n; i++){
            String temp = Integer.toBinaryString(arr2[i]);
            while(temp.length()<n){
                temp = "0"+temp;
            }
            arr2Binary[i] = temp;
        }
        // 둘다 0일 때만 빈칸 채워주고 아니면 # 넣어주기
        for(int i=0; i<n; i++){
            String s = "";
            for(int j =0; j<n; j++){
                if(arr1Binary[i].charAt(j) =='0'&&arr2Binary[i].charAt(j) == '0'){
                    s = s+ " ";
                }
                else {
                    s = s+"#";
                }
            }
            answer[i] = s;
        }
        return answer;
    }
}

<다른 사람의 풀이>

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;
    }
}

해당 코드는 두 개의 이진수 배열 arr1과 arr2를 비트 OR 연산하여, 그 결과로 얻은 이진수를 문자열로 변환한 후 2차원 문자열 배열 result에 저장하는 함수이다. 이후 문자열 포맷팅과 치환을 통해 최종적인 결과를 생성한다.

함수 설명:
n: 이진수의 길이(한 변의 길이)를 나타낸다.
arr1, arr2: 이진수를 담고 있는 두 개의 배열이다.
String[] result = new String[n];: 최종 결과를 담을 result라는 이름의 문자열 배열을 생성한다. 이 배열은 크기가 n인 1차원 배열이다.

for (int i = 0; i < n; i++) { result[i] = Integer.toBinaryString(arr1[i] | arr2[i]); }: 첫 번째 반복문은 arr1과 arr2의 각 요소들을 OR 비트 연산(|)하여 이진수로 변환한 후 result 배열에 저장한다. arr1[i] | arr2[i]는 두 이진수를 비트 OR 연산한 결과를 나타낸다.

for (int i = 0; i < n; i++) { result[i] = String.format("%" + n + "s", result[i]); }: 두 번째 반복문은 문자열 포맷팅을 통해 이진수 문자열의 길이를 n과 같게 맞춘다. 이진수 문자열의 길이가 n보다 작으면 앞에 필요한 만큼 공백을 추가하여 길이를 조정한다.

result[i] = result[i].replaceAll("1", "#");: 세 번째 반복문은 이진수 문자열에서 '1'을 '#'으로 치환한다.

result[i] = result[i].replaceAll("0", " ");: 네 번째 반복문은 이진수 문자열에서 '0'을 ' '로 치환한다.

return result;: 처리가 완료된 최종 결과인 result 배열을 반환한다.

이 코드는 arr1과 arr2의 각 요소를 비트 OR 연산하여 '#'과 ' '로 이루어진 이진수 문자열을 생성하고, 그 결과를 2차원 문자열 배열로 반환하는 것을 목적으로 한다. 이를 통해 주어진 조건에 따라 지도 모양을 나타낼 수 있다.

<핵심 개념>

비트연산으로 효율성을 더 높일 수 있구나 깨달을 수 있었던 문제였다.
기존의 코드의 시간복잡도는 O(n^2)이기도 하고 불필요하게 배열을 만드는 점 등등 효율적이지 못한 코드였다.
둘 중 하나라도 1이면 1이라고 치기 때문에 비트연산에서 or 연산을 쓰면 더 효율적으로 계산이 가능함에 다시한번 감탄. 책에서 배운걸 저렇게 써먹는구나 싶어 신기하고 더 열심히 공부하고 싶어졌다.
또한, Integer.toBinaryString() 메서드를 사용하여 정수를 이진수 문자열로 변환할 수 있기 때문에 이를 활용하여 코드를 더 간결하게 구현할 수 있다.
비트 연산은 이진수 처리와 관련된 문제에서 유용하며, 특히 복잡한 조건문을 피하고 빠른 계산을 필요로 할 때 효과적으로 사용될 수 있다.

profile
두둥탁 뉴비등장

0개의 댓글