문제를 읽고 어떻게 구현해야 할지 한참을 고민했다.
비트 연산을 까맣게 잊고 있었고 2차원 배열을 만들어서 해결하는 쪽으로 생각 했었는데
금방 막혀버리고 말았다. 2진수에 대해 찾아보다 비트 연산에 대해 알게 되었고
비트 연산을 이용하니 급 진전이 있었다.
다만 비트연산을 통해서 10을 2진수로 변환하게 되면 1010으로 결과가 나왔는데
문제를 해결하기 위해선 001010처럼 n에 맞게 앞에 0을 붙혀줘야했다.
여기도 꽤나 많은 시간을 또 썼고... StringBuilder의 insert를 통해서 해결했다.
최종코드
import java.util.Arrays;
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] temp = new String[n];
String[] answer = new String[n];
StringBuilder sb1 = new StringBuilder();
for (int i=0; i<n; i++) {
// StringBuilder에 비트연산 값 설정
StringBuilder sb2 = new StringBuilder(Integer.toBinaryString(arr1[i] | arr2[i]));
// 앞에 0을 삽입해 자릿수 맞춰놓기
while(sb2.length() != n) {
sb2.insert(0, 0);
}
// temp 배열에 비트연산 결과 넣기
temp[i] = sb2.toString();
}
for (int i=0; i< temp.length; i++) {
for (int j=0; j< temp[i].length(); j++) {
// temp 배열을 요소들 돌며 검사
char ch = temp[i].charAt(j);
if(ch == '1') {
sb1.append("#");
}
else {
sb1.append(" ");
}
}
// answer 배열에 문자열 추가
answer[i] = sb1.toString();
// StringBuilder 초기화
sb1 = new StringBuilder();
}
return answer;
}
}
다른분 풀이
String.format을 이용해서 간단히 풀어냈다.
내 코드는 너무 쓸데없이 복잡하다고 느꼈는데 직관적으로 이해하기 쉬워 보인다.
잊지말고 다른 문제에 적용해 봐야겠다.
import java.util.Arrays;
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
StringBuilder sb = new StringBuilder();
// 비트연산
for (int i=0; i<n; i++) {
answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
}
for (int i=0; i<n; i++){
// format을 이용해서 n만큼 자리수 설정
answer[i] = String.format("%"+n+"s", answer[i]);
answer[i] = answer[i].replace("1", "#");
answer[i] = answer[i].replace("0", " ");
}
return answer;
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 최소직사각형 (0) | 2021.11.12 |
---|---|
(Java) 프로그래머스 나머지가 1이 되는 수 찾기 (0) | 2021.11.11 |
(Java) 프로그래머스 문자열 내 마음대로 정렬하기 (0) | 2021.11.05 |
(Java) 프로그래머스 두 정수 사이의 합 (0) | 2021.11.05 |
(Java) 프로그래머스 이상한 문자 만들기 (0) | 2021.11.05 |