728x90
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] temp = new String[n];
String[] answer = new String[n];
for(int i=0;i<n;i++){
temp[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
}
for(int i=0;i<n;i++){
answer[i]="";
for(int j=0;j<n-temp[i].length();j++){
answer[i] += " ";
}
for(int j=0;j<temp[i].length();j++){
if(temp[i].charAt(j)=='1') answer[i] += '#';
else answer[i] += " ";
}
}
return answer;
}
}
어려웠던 점:
1. 자바는 익숙하지 않아서 처음에는 비트연산을 생각하지 못했다.
arr1과 arr2의 각 요소를 2진수로 변환한 뒤 둘 중 하나라도 1이면 '#'이어야 하므로 or연산(|)을 사용
Integer.toBinaryString()을 이용해 String 변수인 temp에 대입
2. temp에 대입하는 2진수는 앞의 0을 생략한다.
따라서 남는 길이만큼 미리 answer에 공백을 삽입해준다.
- 다른 사람의 풀이 참고
내용은 비슷하지만 String.format과 replaceAll 등의 함수를 사용함
- String.format(): 문자열의 형식 지정 - C의 sprintf와 비슷한 듯
String str = String.format("%format", 변수);
format로 지정할 수 있는 형식: 정수, 문자, 16진수, 8진수, 문자열, 부동소수점, 날짜 등...
-> 위 문제에서 2진수를 n개의 문자열로 바꿀 때 사용
- String replaceAll(String 대상, String 변환할문자)
-> 위 문자에서 1을 #으로, 0을 공백으로 바꿀 때 사용
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;
}
}
String.format("%" + n + "s", result[i]); 을 제외하면 시간이 향상됨
->
temp = String.format("%16s", Integer.toBinaryString(arr1[i] | arr2[i]));
temp = temp.substring(temp.length() - n);
n이 16이하라는 조건에 의해 길이 16만큼으로 변환한 뒤 잘라줌
'알고리즘 > 코딩 테스트 문제' 카테고리의 다른 글
[프로그래머스] 소수 만들기(Java) (0) | 2023.10.13 |
---|---|
[프로그래머스] 카드 뭉치(Java) (0) | 2023.10.11 |
[프로그래머스] 문자열 내림차순으로 배치하기(Java) (0) | 2023.10.10 |
[프로그래머스] OX퀴즈(C) (0) | 2023.09.26 |
[프로그래머스] 다항식 더하기(C) (0) | 2023.09.25 |