TIL

TIL (1) - 비밀지도 문제풀이 / toBinaryString /

SLug801 2026. 4. 25. 21:13

알고리즘 수업을 진행한 지 2주째 주말이다.

문제를 풀다 보니 단순 구현보다 문제를 어떻게 바라보고, 어떤 유형의 문제인지 파악하는 점이 더 중요하다는 걸 조금씩 느끼고 있다.

강사님이 말씀하시길, 많은 사람들이 막히는 이유가 무턱대고 코딩하며 구현해내기에 급급하기 때문이고,

추천하는 방법은 노트와 펜을 이용해서 문제를 해석하고 어떻게 풀어나갈 것인지 계획을 적어보는 것이라고 하셨다.

아직까지 그렇게 많은 문제를 풀어보지도 않았고, 백준 골드 티어 정도의 어려운 문제를 풀어 본 적도 없었기 때문에 공감하지 못했다.

그래도 습관을 들이기 위해 노트에 어떻게 풀 건지 계획하며 문제를 풀던 중, ‘효과적인 방법이다’라고 생각하게 된 계기가 있었다.

 

 

프로그래머스 문제 '비밀지도' 

 

문제 설명
이해를 돕기 위한 그림

 

입출력 예시

 

쉽게 말하면 n x n의 칸이 주어지고,

배열 1에는 첫 번째 지도 / n개의 정수형 배열

배열 2에는 두 번째 지도 / n개의 정수형 배열

각 배열의 정수들을 2진수로 변환하고,

0이면 공백, 1이면 #으로 변환,

두 배열을 겹치듯 합쳐

최종 지도를 완성해 출력하는 문제이다.

 

코드를 바로 작성하지 않고, 프로그래머스 제출 칸에
바로 떠오르는 코드는 그대로 적되, 그렇지 않은 부분은 주석으로 처리해 흐름을 정리했다.

일단 첫 번째 배열부터.

class Solution { 
    public String[] solution(int n, int[] arr1, int[] arr2) { 
        String answer[] = new String[n]; 
        String jinsu[]; = new String[n]; 
        for(int i = 0; i < n; i++){ 
            //2진수로 변환 
            for(int j = 0; j < n; j++){ 
                if(jinsu[i].charAt(j) == 1) answer[i] += "#"; 
                else answer[i] += " "; 
            } 
        } 
        return answer;
    } 
}

그리고 생각해 볼것은 2번째 배열과 합치는 방법인데,

 

 

 

반복문을 다시 돌리며

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];

        for (int i = 0; i < n; i++) {
		//2진수로 변환
            }

            String row = "";

            for (int j = 0; j < n; j++) {
                if (jinsu1.charAt(j) == 1 || jinsu2.charAt(j) == 1) {
                    row += "#";
                } else {
                    row += " ";
                }
            }

            answer[i] = row;
        }

        return answer;
    }
}

반복문 안에서 배열 1과 배열 2를 같이 검사, answer[i] 배열에 그때그때 넣어주는 방법이 떠올랐다.

 

그런데 2진수로 변환하는 방법중, 2로 계속 나누는 방법이 있는데, 코드도 복잡해지고 비효율적인것 같아 약 20분간 고민하다가 찾아보았다.

 

String binary = Integer.toBinaryString(n);
 
위 코드는 정수형 변수 n을 2진수 문자열 형태로 바꾸어준다.
  • Integer : Java에서 정수를 다루는 클래스
  • toBinaryString : 정수를 2진수 '문자열'로 바꿔주는 메소드
문자열 2진수로 변환해주기 때문에 charAt을 사용할 계획을 세웠다.
초기 1인지 0인지 검사하는 for문에도 정수1이 아닌 문자열 '1'로 변경해주었다.
 

다만, 한가지 문제점이 있었다.

문제 조건에는 길이가 n 만큼인 2진수 문자열이 필요한데, 

이 메소드는 앞의 0을 생략하기 때문에 길이가 맞지 않는 경우가 발생했다.

String binary = Integer.toBinaryString(5); // n이 5일때
System.out.println(binary); // 101이 출력된다.

 

다음과 같은 처리를 해 주어야 했다.

while(binary.length() < n){
    binary = "0" + binary;
}

binary의 길이가 n보다 작을경우 앞단에 "0"을 추가해준다. 같아지면 종료되며 길이가 맞춰진다.

 

처음에는
“2진수를 직접 구현해야 하네”라고 생각했지만,

이미 존재하는 기능을 알고 활용하는 것이 더 중요하다고 느꼈다.

크게 보면 알고리즘은
모든 것을 직접 구현하는 것이 아니라
필요한 도구를 적절히 사용하는 것이라고 생각되었다.

 

한창 게임그래픽 공부를 할때도 느꼈었다. 

물론 미적, 공간적 감각들도 중요했지만

작업속도와 퀄리티를 챙기기 위해 수많은 기능들을 익혀야 했다.

 

문제를 구현하기에 급급했다면,
2진수 변환 과정에서 막히고 포기했을 것이다.

위 비밀지도 문제를 풀었던 방식처럼
문제를 단계별로 나누고 정리해보니

구현할 수 있는 부분은 먼저 구현해두고,
모르는 부분만 따로 고민하고 공부할 수 있다는 장점도 있었다.

 

모든게 아직 익숙하진 않지만

조금씩 적응 해 나가는 중 인것 같다