Integer.toBinaryString , replace, String.format 이용하기
[1차] 비밀지도 : Level1
https://school.programmers.co.kr/learn/courses/30/lessons/17681
처음 작성한 코드
import java.util.*;
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
String[] binArr1 = new String[arr1.length];
String[] binArr2 = new String[arr2.length];
String[] bin = new String[n];
Arrays.fill(binArr1, "");
Arrays.fill(binArr2, "");
Arrays.fill(answer, "");
for (int i = 0; i < n; i++) {
binArr1[i] += Integer.toBinaryString(arr1[i]).toString();
binArr2[i] += Integer.toBinaryString(arr2[i]).toString();
}
for (int i = 0; i < n; i++) {
bin[i] = Integer.toBinaryString(Integer.parseInt(binArr1[i], 2) | Integer.parseInt(binArr2[i], 2));
}
for (int i = 0; i < n; i++) {
while (bin[i].length() < n) {
bin[i] = "0" + bin[i];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < bin[i].length(); j++) {
if (bin[i].charAt(j) == '1') {
answer[i] += "#";
} else {
answer[i] += " ";
}
}
}
return answer;
}
}
ㄴ 불필요한 배열 생성이 너무 많았다.
두 번째 작성한 코드
import java.util.*;
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
String[] bin = new String[n];
for (int i = 0; i < n; i++) {
bin[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
}
for (int i = 0; i < n; i++) {
while (bin[i].length() < n) {
bin[i] = "0" + bin[i];
}
}
for (int i = 0; i < n; i++) {
answer[i] = bin[i].replace("1", "#").replace("0", " ");
}
return answer;
}
}
ㄴ 불필요한 배열을 제거하였다.
ㄴ replace 를 이용하여 1 -> #, 0 -> 공백으로 변경 시켜주는 부분의 실행 시간을 약간 단축 시켰다.
세 번째 작성한 코드
import java.util.Arrays;
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
for (int i = 0; i < n; i++) {
// 비트 연산 후 이진수로 변환
String binStr = Integer.toBinaryString(arr1[i] | arr2[i]);
// 부족한 길이만큼 앞에 0으로 채우기
binStr = String.format("%" + n + "s", binStr).replace(' ', '0');
// #과 공백으로 변환하여 answer에 저장
answer[i] = binStr.replace('0', ' ').replace('1', '#');
}
return answer;
}
}
ㄴ 부족한 길이만큼 앞에 0으로 채우기를 수행하는 부분의 코드를 String.format 을 이용하여 코드를 더욱 간결하게 만들었다.
ㄴ String.format("%" + n + "s", binaryString) 는 문자열을 지정된 길이(n)로 포맷팅하는데 사용된다. 여기서 %s는 문자열을 나타내는 포맷 지시자이다.
ㄴ 그런데, 실행 시간은 다소 증가하는 것을 확인하였다.
문제점 : 불필요한 배열과 반복문으로 인해 시간이 생각보다 많이 걸려서 리팩토링을 하고자했다.
해결 방법 : Integer.toBinaryString , replace, String.format 을 사용하여 코드를 간결하게 만들었다. 하지만 String.format 을 사용하면서 실행 시간이 늘어나서 다시 두 번째 코드로 제출 했다.
깨달은 바 : 불필요한 배열 생성은 하지 않는 것이 좋겠다. 반복문이 많아지지 않도록 간결한 코드를 작성하도록 해야겠다.
이 문제를 통해 String.format 에 대해 처음 알게 되었다. 가끔은 라이브러리를 사용하는 것 보다 무식하게 for 문을 사용하는 것이 시간 단축에 도움이 될 수도 있는 것 같다.
'코딩테스트 > programming_JAVA' 카테고리의 다른 글
[Java] baekjoon_1181 : 단어 정렬 (0) | 2023.12.25 |
---|---|
[Java] 프로그래머스_134240 : 푸드 파이트 대회 (0) | 2023.12.17 |
[Java] 프로그래머스_42748 : K번째수 (0) | 2023.12.15 |
[Java] 프로그래머스_12915 : 문자열 내 마음대로 정렬하기 (0) | 2023.12.15 |
[Java] 프로그래머스_81301 : 숫자 문자열과 영단어 (0) | 2023.12.13 |