코딩테스트 연습 - 비밀지도

김원기·2025년 1월 21일

코딩테스트

목록 보기
16/21

https://school.programmers.co.kr/learn/courses/30/lessons/17681

이번에 풀어볼 문제는 비밀지도 문제이다.

문제 분석


문제의 조건은 다음과 같다.

여기서 주의깊게 봐야 하는 것은 2번의 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분 을 봐야 한다.

해당 조건은 or 연산을 해야한다는 것을 의미한다.
그림으로 표현하자면 다음과 같다는 것을 알 수 있다.

문제 조건

문제 풀이

  1. 일단 먼저 10진수의 수를 2진수로 변경하는 로직이 필요하다.

Java에서는 10진수를 여러 형태의 숫자로 변경하는 메서드를 제공한다.
이번에 사용할 메서드는 Integer.toBinaryString() 으로 해당 메서드를 통해 10진수 숫자를 2진수 String 형태로 변환할 수 있다.

변수 n의 길이만큼 배열 arr의 길이가 결정되니 반복문을 사용하여 해당 수를 변환하면 된다.

for (int i = 0; i < n; i++) {
    // 1. arr1[i], arr2[i]를 2진수 문자열로 변환
    String binary1 = Integer.toBinaryString(arr1[i]);
    String binary2 = Integer.toBinaryString(arr2[i]);
}
  1. 2진수 String으로 변환 했다면 전체적인 길이를 맞춰줘야 한다.

전체적인 길이를 맞추지 않는 경우를 생각해보자
arr1[0]은 9이고, 9를 2진수로 바꾸게 된다면 1001(2)가 된다.
arr2[0]은 30이고, 30을 2진수로 바꾸게 된다면 11110(2)가 된다.

이렇게 전체적인 길이가 일치하지 않는다면 n의 길이만큼 반복하여 비교할 때 길이가 맞지 않게되고 IndexOutOfBoundsException 오류가 발생할 가능성이 높다.

// 2. n 길이에 맞춰 앞에 0 채우기
binary1 = String.format("%" + n + "s", binary1).replace(' ', '0');
binary2 = String.format("%" + n + "s", binary2).replace(' ', '0');

String.format(%ns, binary1)는 n만큼의 길이로 String의 길이를 변경하는 방식이며
replace(' ','0') 은 공백을 0으로 변경한다는 의미다.

그럼 1001을 5자리로 변경해도 10010이 아닌가?

싶은 의문이 들긴하는데 기본적으로 앞부터 공백으로 전환하기 때문에 01001(2)로 변경된다는 것이다.

  1. or연산

이제 2진수로 변경하고, 문자열의 길이도 맞췄으니 각 지도에 따라 or연산만 하면 된다.
나는 빠른 문자열 연산을 위해 StringBuilder를 사용할 예정이다.

// 3. StringBuilder를 사용하여 OR 연산 수행
StringBuilder sb = new StringBuilder();
for (int j = 0; j < n; j++) {
    if (binary1.charAt(j) == '1' || binary2.charAt(j) == '1') {
        sb.append("#"); // 하나라도 1이면 벽
    } else {
        sb.append(" "); // 둘 다 0이면 공백
    }
}

전체 코드

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++) {
            // 1. arr1[i], arr2[i]를 2진수 문자열로 변환
            String binary1 = Integer.toBinaryString(arr1[i]);
            String binary2 = Integer.toBinaryString(arr2[i]);

            // 2. n 길이에 맞춰 앞에 0 채우기
            binary1 = String.format("%" + n + "s", binary1).replace(' ', '0');
            binary2 = String.format("%" + n + "s", binary2).replace(' ', '0');

            // 3. StringBuilder를 사용하여 OR 연산 수행
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < n; j++) {
                if (binary1.charAt(j) == '1' || binary2.charAt(j) == '1') {
                    sb.append("#"); // 하나라도 1이면 벽
                } else {
                    sb.append(" "); // 둘 다 0이면 공백
                }
            }

            // 4. 결과 저장
            answer[i] = sb.toString();
        }

        return answer;
    }
}
profile
혼자 공부하는 블로그라 부족함이 많아요 https://www.notion.so/18067a27ac7e4f4790dde645fb3bf3d3?pvs=4

0개의 댓글