Skip to main content

[Java] 17681 [1차]비밀지도


📝 [1차] 비밀지도

1. 문제 요약

image.png

​문제가 좀 어렵게 써져 있는데 쉽게 요약을 하면 아래와 같다

  • 지도는 정사각형 배열 형태로 각 칸은 공백(" ") 또는 벽("#")이다.
    • 지도 두 개를 겹쳤을 때 하나라도 #이면 벽
    • 둘 다 공백이면 공백
  • 지도 1과 지도 2는 각각 정수배열로 암호화 되어 있음
    • 벽은 1
    • 공백은 0
    • 각 줄마다 1과0으로 이루어진 이진수의 합
  • 매개변수로 지도의 한 변의 길이 n, arr1, arr2 주어짐
  • 원래의 비밀 지도를 해독해서 '#', 공백으로 구성된 문자열 배열로 출력하기

2. 접근 방법

  1. arr1과 arr2에서 숫자 하나씩 가져와서 OR 비트연산
  2. 비트연산 결과 이진수로 변환
  3. 오른쪽 정렬, 자리수 n으로 맞추기
  4. "1"은 "#"으로, "0"은 " "으로 치환
  5. 배열에 담아 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 메서드 써도 공백 자리는 최종 지도에서는 그대로 빈칸으로 표현된다.