프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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 풀이를 한 사람이 많았지만 ( 뜨끔 ,, ) 비트 연산을 잘 다룰 수 있는지를 묻고자 하는 의도였다고 한다.
이런 유형을 풀 때는 비트 연산을 기억하자 !
'Algorithms > programmers' 카테고리의 다른 글
Programmers, [3차] 방금그곡 : Java (0) | 2022.12.08 |
---|---|
Programmers, 오픈채팅방 : Java (0) | 2022.12.07 |
Programmers, [1차] 다트 게임 : Java (0) | 2022.12.06 |
Programmers, [1차] 뉴스 클러스터링 : Java (0) | 2022.12.06 |
Programmers, [1차] 캐시 : Java (0) | 2022.12.02 |