1. 문제
2. 문제 해결 논리
1. 문제 이해
- 주어진 것
- int n //지도의 한 변의 쿠기
- int[] arr1 //하나의 지도인 정수 배열
- int[] arr2 //다른 하나의 지도인 정수 배열
- 요구되는 것
- String[] answer //두 지도를 합쳐 "#"과 " "로 이루어진 최종 지도인 문자열 배열
2. 데이터 구조 결정
- Integer 클래스의 toBinaryString 메서드, String 클래스의 format, replaceAll 메서드 사용
- 반복문, StringBuilder, 쉬프트 연산자 사용
3. 알고리즘 설계
- toBinaryString, format, replaceAll 메서드
- Integer.toBinaryString 메서드로 2진법 문자열로 변환
- String.format 메서드로 한 변의 크기만큼 2진법 문자열에 공백 추가
- String.replaceAll 메서드로 문자열 중 1은 #으로, 0은 공백으로 대체
- 반복문, StringBuilder, 쉬프트 연산자 사용
- 반복문을 통해서 String에 연산 결과가 담긴 StringBuilder를 저장
- 반복문을 통해서 1을 n번 쉬프트 이동
- arr1과 arr2의 이진수가 쉬프트 이동된 1과 같은 자리에 1이 동시에 존재하는지 확인
- 존재하면 "#", 존재하지 않으면 " " 추가
3. 코드 구현
3-1. toBinaryString, format, replaceAll 메서드
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
//n이 5라면
String[] answer = new String[n];
//주어진 정수 배열을 하나씩 순회
for (int i = 0; i < n; i++) {
//같은 인덱스에서 두 원소를 비트 합연산( | )
String row = Integer.toBinaryString(arr1[i] | arr2[i]);
//지도의 크기만큼 왼쪽에 공백 추가
//n이 5라면 ("%5s", row)와 같다
//row가 1001이라면 "%5s"에 의해 1001이 오른쪽 정렬되면서 맨 왼쪽에는 공백이 추가됨
//즉, " 1001"로 다섯자리의 문자열로 변환됨
row = String.format("%" + n + "s", row);
// 1을 벽('#')으로 대체
row = row.replaceAll("1", "#");
// 0을 공백(' ')으로 대체
row = row.replaceAll("0", " ");
//반환할 문자열 배열 answer의 원소로 추가
answer[i] = row;
}
return answer;
}
}
3-2. 반복문, StringBuilder, 쉬프트 연산자
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
//answer에 i=0부터 순회하며 문자열 추가
for (int i = 0; i < n; i++) {
StringBuilder sb = new StringBuilder();
//이진수의 제일 앞자리부터 순회하기 위해 j = n-1에서 시작
//n-1 >= j >= 0 이므로 총 n번 순회
//n이 5라면, j = 4,3,2,1,0으로 순회
for (int j = n - 1; j >= 0; j--) {
//j가 4라면 1을 왼쪽으로 네 번 쉬프트 이동하여 bit에 저장
//-> 10000
//4만큼 쉬프트 이동했기 때문에 bit에는 1이 맨 앞자리에만 존재
int bit = (1 << j);
//arr1이나 arr2가 bit와 동일한 자리에 1이 존재한다면
if ((arr1[i] & bit) > 0 || (arr2[i] & bit) > 0) {
sb.append("#"); //"#" 벽 추가
//arr1과 arr2 둘 다 동일한 자리에 1이 없다면
} else {
sb.append(" "); //" " 공백 추가
}
}
//작업이 완료된 StringBuilder를 answer의 원소로 저장
answer[i] = sb.toString();
}
return answer;
}
}
* Reference
https://school.programmers.co.kr/learn/courses/30/lessons/17681
반응형
'PS > Programmers' 카테고리의 다른 글
[level1, HashSet/TreeSet] 두 개 뽑아서 더하기 (0) | 2023.03.30 |
---|---|
[level1, 배열/정렬] K번째수 (0) | 2023.03.29 |
[level1, Arrays] 삼총사 (0) | 2023.03.26 |
[level1, Arrays] 예산 (0) | 2023.03.25 |
[level1, Character] 시저 암호 (1) | 2023.03.24 |