728x90

이 문제는 비트 연산(Bitwise Operaiton)을 묻는 문제라고 한다. 2진수로 처리하라는 내용이 힌트이고, OR로 처리하면 된다. if else 풀이를 한 사람이 많았지만 ( 뜨끔 ,, ) 비트 연산을 잘 다룰 수 있는지를 묻고자 하는 의도였다고 한다. 이런 유형을 풀 때는 비트 연산을 기억하자 !.

 

 

프로그래머스

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

programmers.co.kr

 

처음 구상한 코드는 다음과 같다. 

 

1. toBinaryString()을 사용해 10진수를 2진수로 변환한다.

2. 변환한 2진수의 길이를 통일한다.

3.   StringBuilder를 이용해 공백 혹은 #을 append 하고, 그 값을 answer에 넣어준다.

 

import java.util.*;

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        
        for (int i=0; i<n; i++) {
            
            // 1. 10진수를 2진수로 변환한다.
            
            String x = Integer.toBinaryString(arr1[i]);
            String y = Integer.toBinaryString(arr2[i]);
            
            // 2. 변환한 2진수의 길이를 통일한다.
            
            String zero = "";
            if (x.length()<n) {
            	int num = n - x.length();
            	for (int j=0; j<num; j++) {
            		zero = "0" + zero ;
            	}
            	x = zero + x;
            }
            
            zero = "";
            if (y.length()<n) {
            	int num = n - y.length();
            	for (int j=0; j<num; j++) {
            		zero = "0" + zero ;
            	}
            	y = zero + y;
            }
            
            // 3. 두 장의 지도를 겹친다.
            
            StringBuilder sb = new StringBuilder();
            
            for (int j=0; j<n; j++) {
                char a = x.charAt(j);
                char b = y.charAt(j);
                
                if (a == '0' && b == '0') sb.append(" ");
                else sb.append("#");
            }
            
            answer[i] = sb.toString();

        }
        
        return answer;
    }
}

 

 

+ 더 나은 풀이 방법

문제를 다 풀고 다른 코드를 찾아보니

나처럼 arr1과 arr2 안의 숫자를 각각 2진수로 변환해 두 숫자를 합치지 않아도,

비트 논리 연산자 OR (논리합)를 사용하면 더 간단한 코드로 구현할 수 있다.

OR ( | )는 두 비트 중 하나만 1이면 연산 결과는 1이다.

 

변환한 2진수는 문자열의 형식을 설정할 때 이용하는 %s(=String Formatting)을 이용해 길이를 통일한다.

String.format("%" + n + "s", binary) :  binary의 길이보다 숫자 n이 더 작으면 앞에 공백을 추가해준다고 한다.

 

마지막으로 문자열 치환을 해주는 Replace 함수를 사용해 공백 혹은 #으로 바꾸어준다.

코드는 아래와 같다.

import java.util.*;

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        
        for (int i=0; i<n; i++) {
            
            // 1. 10진수를 2진수로 변환 : 비트 논리 연산자 OR 사용
            
            String binary = Integer.toBinaryString(arr1[i] | arr2[i]);
            binary = String.format("%" + n + "s", binary);
            
            // 2. replace 함수로 문자열을 치환한다.
            
            binary = binary.replace('0', ' ');
            binary = binary.replace('1', '#');        
            answer[i] = binary;
        }
        return answer;
    }
}

 

그런데 실행 결과를 보면 효율은 첫 번째로 푼 코드가 더 좋아보인다 ,,

하지만 !

 

Kakao Tech 블로그에서 문제 해설을 보면 이 문제는 비트 연산(Bitwise Operaiton)을 묻는 문제라고 한다.

2진수로 처리하라는 내용이 힌트이고, OR로 처리하면 된다.

if else 풀이를 한 사람이 많았지만 ( 뜨끔 ,, ) 비트 연산을 잘 다룰 수 있는지를 묻고자 하는 의도였다고 한다.

이런 유형을 풀 때는 비트 연산을 기억하자 !

728x90

+ Recent posts