https://school.programmers.co.kr/learn/courses/30/lessons/17681
핵심
2개의 배열의 값을 2진수로 바꾸어, 각 배열의 값이 둘 중 1개라도 1이면 새로운 배열에 # 아니면 공백을 추가해준다.
정답 코드, 처음 풀이
public class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
for (int i =0;i<n;i++){
String first = Integer.toBinaryString(arr1[i]);
if (first.length()<n){
String empty="";
for (int k=0;k<n-first.length();k++){
empty += "0";
}
first = empty+first;
}
String second = Integer.toBinaryString(arr2[i]);
if (second.length()<n){
String empty="";
for (int k=0;k<n-second.length();k++){
empty += "0";
}
second = empty+second;
}
StringBuilder sb = new StringBuilder();
for (int j=0; j <n;j++){
if (first.charAt(j)=='1'||second.charAt(j)=='1'){
sb.append("#");
}
else sb.append(" ");
}
answer[i] = sb.toString();
}
return answer;
}
}
해설
각 배열을 2진수로 바꾸어준다. 이때 문제는 만약 수가 작을 경우 if) 2 같은 경우 2진수로 바꾸어도 10이다.
즉 만약 크기가 5라면 앞에 000을 붙여주어야한다.
따라서 나는 empty를 만들어서 길이가 부족한 만큼 0을 추가해주었다.
이후 두 개의 2진수로 바꾼 배열을 비교한다.
만약 2개의 배열중 각 index에서 1개라도 1이 있다면 #을 추가해주고 아니면 공백을 추가한다.
if) 10101, 00010 -> # ###이 된다.
다른 정답 코드
public 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;
}
}
해설
temp라는 문자열에 format메서드를 사용하였다.
n의 최대길이가 16이기 때문에, %16을 사용하면 길이가 부족하더라도 앞은 공백으로 채워진다.
이후 substring을 사용하여, 길이를 맞추어준다.
남은 값이 1이면 #으로 바꾸고, 0이면 공백으로 바꾸어준다.
배운 점
이미 정의되어있는 String의 메서드를 제대로 활용하면, 코드의 길이와 성능적인 부분에서도 상당히 효과를 볼 수 있다.
나의 코드와 다른 코드는 시간 복잡도 측면에서도 벌써 n배 차이가 난다.
단순하게 생각대로 for문을 사용하는 것을 줄여야겠다.
또한 String.format에 대해서도 무지했다. 오늘도 새로운 것을 배워간다.
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 명예의 전당(1) (java) (2) | 2022.11.25 |
---|---|
*재귀함수* inequal (1) | 2022.10.23 |
[프로그래머스]문자열 내 마음대로 정렬하기(java) (0) | 2022.10.13 |
[백준] 2204번 도비의 난독증 테스트(java) (0) | 2022.10.12 |
*재귀함수* division (0) | 2022.10.12 |