알고리즘

프로그래머스 - 비밀 지도 [2018 KAKAO BLIND RECRUITMENT]

Heidong 2022. 7. 6. 17:44
반응형

 

내 풀이

import java.util.Arrays;
import java.util.Stack;

public class P_36 {

    public static String[] binary(int x, int n) {
        // 10진수 -> 2진수 변환 메소드

		Stack<String> stack = new Stack<>();
		String[] list = new String[n]; // 2진수 저장 배열 (방크기는 한변의 길이 n)

		for(int i=x; i>=1; i=i/2) { // 10진수 -> 2진수로 변환
			if(i%2 == 1) {
				stack.push("1");
			} else if(i%2 == 0) {
				stack.push("0");
			}
		}

		if(stack.size() != n) {
			int check = 0;
			for(int i=0; i<n - stack.size(); i++) {
				list[i] = "0";
				check = i;
			}
			while(!stack.empty()) { // stack에서 위에서부터 꺼내면서 삭제
				list[check+1] = stack.pop();
				check++;
			}
		} else {
			for(int i=0; i<list.length; i++) {
				list[i] = stack.pop();
			}
		}

		return list;
	}

    public String[] solution(int n, int[] arr1, int[] arr2) {
        // 비밀 지도

        String[] answer = new String[n];
        int cnt = 0;

        for(int i=0; i<arr1.length; i++) { 
            String[] one = new String[n];
            String[] two = new String[n];
            String out = "";

            one = binary(arr1[i], n);
            two = binary(arr2[i], n);
            
            for(int j=0; j<one.length; j++) {
                if(one[j].equals("1") || two[j].equals("1")) {
                    out += "#";
                } else {
                    out += " ";
                }
            }
            answer[cnt] = out;
            cnt++;
        }


        return answer;
    }

    public static void main(String[] args) {
        P_36 p = new P_36();

        int n = 6;
        int[] arr1 = {46, 33, 33 ,22, 31, 50};
        int[] arr2 = {27 ,56, 19, 14, 14, 10};
        String[] ans = p.solution(n, arr1, arr2);

        System.out.println(Arrays.toString(ans));

    }
}

풀 당시에는 진수 변환 함수를 몰라서 그냥 만들었다.

 

로직 2개를 분리해서 풀었다.

1. 10진수를 2진수로 변환 해야함

2. 본 문제가 요구하는 비밀 지도 완성

 

last in first out의 구조인 stack 클래스를 이용해서 2진수를 구했다.

 

https://eunhee-programming.tistory.com/54

 

2진수,10진수계산법/이진수,십진수 계산법(빠른 계산법)/이진법,십진법 계산

10진수,2진수 계산법 10진수,2진수,8진수,16진수 표 10진수에서 2진수로 계산하는 방법은 두개가 있습니다. 하나는 기본적인 계산법, 또 다른 하나는 빠른 계산법입니다. 10진수->2진수 계산법 (기본

eunhee-programming.tistory.com

 

그리고 반복문 2개를 중첩하여 한쪽이라도 1인 부분을 # 으로 바꾸고 아닌 부분을 공백으로 바꾸는 로직을 구성 했다.

 

 

다른 사람 풀이

class Solution {
  public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] result = new String[n];
        for (int i = 0; i < n; i++) {
            result[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }

        for (int i = 0; i < n; i++) {
            result[i] = String.format("%" + n + "s", result[i]);
            result[i] = result[i].replaceAll("1", "#");
            result[i] = result[i].replaceAll("0", " ");
        }

        return result;
    }
}

toBinaryString :  Integer 클래스의 toBinaryString는 자바에서 지원해주는 진수 변환 함수이다. (10진수 -> 2진수)

| -> 비트 단위 논리 연산자의 OR 연산

arr1[i], arr[2]]에 해당하는 10진수들을 2진수로 바꿔서 서로 논리합 비교를 수행함

-> 둘중 하나라도 1이면 1이됨.

즉 문제에서 요구하는 한쪽이라도 1이면 1이다 라는 뜻

ex) arr1의 원소가 10진수 9이고 arr2의 원소가 10진수 30일 경우

-> 9를 2진수로 했을시 01001, 30을 2진수로 했을시 11110

-> 자리수중에 하나라도 1이면 1로 바꾼다는 뜻 

-> 최종적으로 11111가 나옴

 

그리고 String.format을 통해서 문자열의 서식을 정함.

% = 10진수 형식

%s = 문자열을 그대로 출력함 하지만 s 앞에 숫자(n)을 넣을경우, 오른쪽 인자인 result[i]보다 작을경우 공백을 추가함.

-> 자리수가 5자리를 넘어갔을 경우(n이 6이상) 2진수로 표현했을때 앞자리는 0으로 해야함 즉 공백이어야 함.

 

 

 

 

 

다른 사람 풀이 - 재귀 방식

class Solution {
    public String makeSharp(int n, int m) {
        if(n == 0) {
            if( m > 0) {
                String str = "";
                for(int i = 0; i < m; i++) {
                    str += " ";
                }
                return str;
            }
            else return "";
        }
        else {
            return n % 2 == 0 ? makeSharp(n/2, m-1) + " " : makeSharp(n/2, m-1) + "#"; 
        }
    }
    public String[] solution(int n, int [] arr1, int [] arr2) {
        String [] answer = new String[n];
        int [] secretMap = new int[n];
        for(int i = 0; i < n; i++) {
            secretMap[i] = arr1[i] | arr2[i];
            answer[i] = makeSharp(secretMap[i], n);
        }
        return answer;
    }
}
반응형