-
프로그래머스 - 비밀 지도 [2018 KAKAO BLIND RECRUITMENT]알고리즘 2022. 7. 6.반응형
내 풀이
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개를 중첩하여 한쪽이라도 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; } }
반응형'알고리즘' 카테고리의 다른 글
프로그래머스 - 예산 (0) 2022.07.21 프로그래머스 - 두 개 뽑아서 더하기 (0) 2022.07.11 프로그래머스 - 나머지가 1이 되는 수 찾기 (0) 2022.07.04 프로그래머스 - 2016년 (0) 2022.07.01 프로그래머스 - 최소직사각형 (0) 2022.06.30