[Java] 17681 [1차]비밀지도
📝 [1차] 비밀지도
1. 문제 요약
문제가 좀 어렵게 써져 있는데 쉽게 요약을 하면 아래와 같다
- 지도는 정사각형 배열 형태로 각 칸은 공백(" ") 또는 벽("#")이다.
- 지도 두 개를 겹쳤을 때 하나라도 #이면 벽
- 둘 다 공백이면 공백
- 지도 1과 지도 2는 각각 정수배열로 암호화 되어 있음
- 벽은 1
- 공백은 0
- 각 줄마다 1과0으로 이루어진 이진수의 합
- 매개변수로 지도의 한 변의 길이 n, arr1, arr2 주어짐
- 원래의 비밀 지도를 해독해서 '#', 공백으로 구성된 문자열 배열로 출력하기
2. 접근 방법
- arr1과 arr2에서 숫자 하나씩 가져와서 OR 비트연산
- 비트연산 결과 이진수로 변환
- 오른쪽 정렬, 자리수 n으로 맞추기
- "1"은 "#"으로, "0"은 " "으로 치환
- 배열에 담아 return
3. 정답코드
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String answer[] = new String[n];
for(int i = 0; i < arr1.length; i++) {
// OR연산
// int num = Integer.bitCount(arr1[i] | arr2[i]);
int num = arr1[i] | arr2[i];
// String binaryStr = Integer.toBinaryString(num);
// String padded = String.format("%" + n + "s", binaryStr);
String binary = String.format("%" + n + "s", Integer.toBinaryString(num));
answer[i] = binary.replace("1", "#").replace("0", " ");
}
return answer;
}
}
Integer.toBinaryString(num)
→ 2진수로 변환String.format("%" + n + "s", …)
→ 길이 n로 맞추면서 좌측 공백 채움
4. 오답 / 어려웠던 점
1) OR연산 한 값은 10진수로 반환됨 다시 2진수로 변환하려면 Integer.toBinaryString(num) 메서드 사용한다.
2) 이진수로 바꾼후에도 글자수 맞추고, 오른쪽 정렬 하기
1. Integer.toBinaryString(num)
- num 정수를 2진수 문자열로 변환
- 예: 5 → "101", 9 → "1001"
- 여기서 나온 문자열은 자릿수가 일정하지 않을 수 있음
2. String.format("%" + n + "s", …)
%ns
는 총 길이를 n으로 맞춘 오른쪽 정렬 문자열을 만들어 준다.- 부족한 자리만큼 왼쪽에 공백
' '
을 채우기 때문이다. - 예를 들어 n=5, binary="101"이면:
" 101" // 앞에 공백 2칸 추가
- 즉, 여기서 채워지는 건 공백이지, 0이 아니다.
- 하지만 replace 메서드 써도 공백 자리는 최종 지도에서는 그대로 빈칸으로 표현된다.