반응형
🔺 문제
🔺 코드
- 틀린 코드
import java.util.*;
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
// 10진수 -> 2진수
String[] decimalToBin1 = new String[n];
String[] decimalToBin2 = new String[n];
// 일단 배열을 다 이진수로 바꾸고
// arr1 vs arr2의 String의 chartAt해서 비교해
// 비교해서 이진수로 만들어놓고, 얘를 replace해
for(int i=0 ; i < n ; i++) {
decimalToBin1[i] = Integer.toBinaryString(arr1[i]);
decimalToBin2[i] = Integer.toBinaryString(arr2[i]);
}
// 이 변환한 string이 n 크기만큼이 아니면 그 앞에 0 붙여주기
for(int i=0 ; i < n ; i++) {
StringBuilder str = new StringBuilder(binary);
int len = decimalToBin1[i].length();
if(len < n) {
for(int j=0 ; j < (n-len) ; j++) {
str.insert(0, "0");
decimalToBin1[i] = str.toString();
}
}
}
for(String s : decimalToBin1) {
System.out.println("decimalToBin1[i]-> " + s);
}
return answer;
}
}
구현해보다가 시간이 길어져서 포기했지만...생각했던 방법은 이렇다.
1) 배열 arr1과 배열arr2의 int형인 십진수를 이진수로 바꾸고 String형 배열에 저장해두기.
2) 이진수로 변환한 값의 길이 < n 이면 앞에 그만큼 반복문 돌려서 '0' 붙여주기
3) charAt을 써서 decimalToBin1, decimalToBin2 둘 다 1이면 1, 둘 다 0 이면 0, 그게 아니면 1로 반환하게 해서 answer 배열에 저장 ( = OR)
4) 저장된 answer의 값은 1과 0으로 이뤄졌으니까, 이걸 '#'이랑 ' ' 로 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++) {
answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
answer[i] = answer[i].replace('0', ' ');
answer[i] = answer[i].replace('1', '#');
while(answer[i].length() < n) {
answer[i] = ' ' + answer[i];
}
}
return answer;
}
}
✅ 해결 아이디어
✔Integer.toBinaryString
: 십진수를 이진수로 변경 (String형으로 반환)
- answer[i]에 저장하는 값 → OR 비트연산
생각보다 간단해서 놀람... 내가 너무 어렵게 생각하는 거 같기도 하구ㅠ
나는 애초에 그냥 answer[i] 길이가 n보다 작으면 앞에 그만큼 0을 저장하고 이걸 ' ' 로 replace할 생각을 했는데
그럴 필요 없이 앞에 ' ' + 해주면 되었던 것이다...
🔺 다른 풀이들
- 풀이1)
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;
}
}
자릿수 맞출 때, 0을 ' '로 바꾸는 반복문을 돌려주는 대신, String.format()
을 사용해서 앞을 공백으로 채워준 풀이... (9번째 줄)
✔ String.format("%Ns", str);
: str.length()가 N보다 작을 경우 앞에 공백 추가
- 풀이2)
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
String temp;
for(int i = 0 ; i < n ; i++){
temp = String.format("%16s", Integer.toBinaryString(arr1[i] | arr2[i]));
temp = temp.substring(temp.length() - n);
temp = temp.replaceAll("1", "#");
temp = temp.replaceAll("0", " ");
answer[i] = temp;
}
return answer;
}
}
위에서 사용한 "%" + n + "s"
을 하지 않고, "%16s"
해놓고 substring해서 잘라쓴 풀이 (이게 속도가 더 빠르다함)
(참고)
✔ 0 채우기 - 문자열 앞에 prefix 붙이기 (StringBuilder / StringBuffer 이용)
✔ String.format()
: 문자열 형식 지정 (자릿수 채우기)
- 풀이
반응형
'코테 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Lv. 1] 실패율 (0) | 2023.03.29 |
---|---|
[프로그래머스/Lv. 1] 로또의 최고 순위와 최저 순위 (0) | 2023.03.29 |
[프로그래머스/Lv. 1] [1차] 다트 게임 (0) | 2023.03.20 |
[프로그래머스/Lv. 1] 체육복 (1) | 2023.03.16 |
[프로그래머스/Lv. 1] 가장 가까운 같은 글자 (0) | 2023.03.15 |