문제설명
입력 & 출력
나의 풀이
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++){
String binary = Integer.toBinaryString(arr1[i] | arr2[i]);
while(binary.length() < n){
binary = "0" + binary;
}
StringBuilder sb = new StringBuilder();
for(int j = 0 ; j < n ; j++){
if(binary.charAt(j) == '1'){
sb.append("#");
}else{
sb.append(" ");
}
}
answer[i] = sb.toString();
}
return answer;
}
}
이번 문제는 문제 설명이 좀 길지만 숫자로 암호화된 지도 1과 지도 2가 주어졌을 때 두 개의 지도를 하나의 "전체 지도"로 합치는 데 이때 해당 숫자를 이진법으로 변환한 뒤 "1"이면 벽 # "0"이면 공백을 출력하면 되는 문제입니다.
지도 1과 지도 2중 둘 중 하나라도 벽인 부분은 전체 지도에서 벽이라는 것을 주의하고 풀면 어렵지 않게 풀 수 있습니다.
예를 들어 지도 1의 첫 번째 줄이 "01001"이고, 지도 2의 첫 번째 줄이 "11110"이라면 전체 지도의 첫 번째 줄은 "11111"로 합쳐집니다.
먼저 처음에는 정수 9 ➡️ "1001"이기 때문에 정수 배열을 한번 전체적으로 순회를 한 뒤 가장 긴 길이를 구하고, 해당 길이가 아니라면 앞에 "0"을 채워주는 식으로 진행을 했었는데 다시 한번 생각을 해보니 지도의 한 변의 길이 n이 주어졌기 때문에 해당 작업은 필요가 없습니다.
다시 코드를 설명하자면 먼저 전체 지도의 크기만큼 answer 배열을 초기화를 해줍니다.
그리고 for문 안에서 Integer.toBinaryString() 메서드를 사용하여 이진수로 바꿔주는 데 여기서 OR연산자를 사용하여 두 비트 중 하나라도 벽이면 벽으로 만듭니다.
정수형 상태에서 OR 연산 수행
- arr1[i] | arr2 [i]는 정수형의 OR 연산을 수행합니다.
- 예를 들어, arr1[i]가 9(이진수 1001)이고 arr2 [i]가 30(이진수 11110)이라고 가정합니다.
- 9 | 30는 31이 됩니다. (이진수로 11111)
즉 + 연산이 아니고, 비트 연산의 OR 연산이기 때문에 9 | 30 ➡️ 31(11111) 이 저장되게 됩니다.
그리고 9 ➡️ 1001 이므로. 길이가 1모자랍니다. 따라서 길이가 모자란 부분을 앞에 0을 추가해 주는 작업을 실행해야 합니다. 해당 작업을 while문에서 수행합니다.
해당 작업은 if문으로도 해결할 수 있습니다.
if (binary.length() < n) {
binary = "0".repeat(n - binary.length()) + binary;
}
마저 코드를 설명하자면 전체 지도를 저장할 StringBuilder를 선언해주고, for문을 통해서 전체 지도의 숫자 문자열 즉 암호화된 전체 지도를 순회합니다.
각 문자에 접근을 하기 위해서 charAt() 메서드를 사용하고, 해당 요소가 '1'이라면 벽이라는 의미기 때문에 전체 지도에 벽 #을 추가해 주고 아니라면 공백 " "을 저장해 줍니다.
위 작업까지 한다면 전체 지도의 한 줄을 완성한 것이기 때문에 앞서 전체 지도의 answer배열에 한 줄씩 추가해 주어 마무리해 줍니다.
참고 ❗
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] Lv2. 전화번호 목록 (HashSet, startsWith, Java) (0) | 2024.06.11 |
---|---|
[프로그래머스] Lv.2 영어 끝말잇기 (contains(), charAt(), ArrayList, Java) (0) | 2024.06.10 |
[프로그래머스] Lv.2 이진 변환 반복하기 (toBinaryString, chars(), stream.count(), Java) (1) | 2024.06.08 |
[프로그래머스] Lv.1 예산 (greedy, 탐욕, 그리디 알고리즘, Java) (0) | 2024.06.08 |
[프로그래머스] 없는 숫자 더하기 (Arrays.stream() anyMatch, sum(), Java) (1) | 2024.06.08 |