[구현] [프로그래머스] [1차] 비밀지도 (Java)

eunsil·2024년 8월 13일
0

유형: 구현
문제: 프로그래머스 - [1차] 비밀지도

문제



풀이

  • n개의 숫자가 들어있는 arr1arr2를 해독해 비밀지도를 찾는다.
  • 암호화된 숫자는 지도의 가로줄에서 벽이 1, 공백이 0 이라고 했을 때 얻을 수 있는 이진수에 해당된다.
  • 즉, 숫자를 이진수로 변환하면 비밀지도의 가로줄을 알 수 있다.

  1. arr1arr2의 요소를 하나씩 이진수로 변환

    • 동일한 코드를 2번 사용하므로 함수로 추출

      재귀 호출로 이진수 변환하기
      스택이 너무 쌓일까봐 문제에서는 재귀로 구현하지 않았다.
      재귀 방법도 알아두면 좋으니 메모!

      public static void toBinary(int n) {
           if (n == 0) return;
         
           toBinary(n / 2);
           System.out.print(n % 2);
       }
    
    
  2. 변환한 각각의 이진수 비교

    • 둘 중 하나라도 1이면 # (벽)
    • 둘 다 같다면 공백
  3. 해독 결과 저장



코드

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

        for (int i = 0; i < n; i++) {

            // 이진수 변환
            String s1 = toBinary(arr1[i], n);
            String s2 = toBinary(arr2[i], n);

			// 암호 해독
            StringBuilder sb = new StringBuilder();
            for (int j = 0; j < n; j++) {

                if (s1.charAt(j) == '1' || s2.charAt(j) == '1' ) {
                    sb.append("#");
                    continue;
                }

                if (s1.charAt(j) == s2.charAt(j)) {
                    sb.append(" ");
                }
            }

			// 해독 결과 저장
            answer[i] = sb.toString();
        }
        
        return answer;
    }
    
    
    public static String toBinary(int n, int size) {
        StringBuilder sb = new StringBuilder();

        while (n > 0) {
            sb.append(n % 2);
            n /= 2;
        }

        while (sb.length() < size) {
            sb.append("0");
        }

        return sb.reverse().toString();
    }
    
}

0개의 댓글