본문 바로가기
알고리즘/프로그래머스

[프로그래머스 / [1차] 비밀지도 / JAVA]

by KDW999 2023. 3. 20.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 접근

정해진 배열 안에 숫자들을 이진법으로 만들어야 되는데 정답률이 높은 거 보고 바꿔주는 메서드가 있을 거 같아서 찾아봤다.

https://dpdpwl.tistory.com/92

 

[Java]자바 진수변환(10진수->2진수,8진수,16진수)

10진수를 2진수,8진수,16진수로 변환 할 때, Integer 클래스의 함수를 사용하면 쉽게 변환이 가능합니다. Integer 클래스의 toBinaryString, toOctalString, toHexString 함수를 사용하면 각각 2진수,8진수 16진수로

dpdpwl.tistory.com

 

이 분 글을 보면 10진수를 2, 8, 16진수로 2, 8, 16진수를 다시 10진수로 바꿔줄 수 있다.

 

Integer.toBinaryString()으로 숫자를 이진수 문자열로 바꿔줄 수 있다.

변환된 이진수는 앞에 0이 없기 때문에 n의 크기에 맞춰 앞에 0을 추가

String 배열은 기본 값이 null이라서 ""로 초기화 해주고 이후엔 두 배열의 대조 후 1, 0에 따라 맞는 문자를 answer에 대입

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
		
        String[] answer = new String[n]; // int 배열은 초기값이 0으로 되있으나 String 배열은 null이다.
        for(int i=0; i<answer.length; i++) answer[i] = "";
        
        String[] map1 = new String[n];
        String[] map2 = new String[n];
        
        // 이진수 변환 및 0 채워주기
        for(int i=0; i<map1.length; i++) {
        	map1[i] = Integer.toBinaryString(arr1[i]);
        	map2[i] = Integer.toBinaryString(arr2[i]);
        	while(map1[i].length() < n) map1[i] = "0" + map1[i];
            while(map2[i].length() < n) map2[i] = "0" + map2[i];
        }
        
        for(int i=0; i<n; i++) {
        	for(int j=0; j<n; j++) {
        		if(map1[i].charAt(j) == '1' ||
        		   map2[i].charAt(j) == '1')  {
                   answer[i] += "#";
        		}
        		else if(map1[i].charAt(j) == '0' &&
        				map2[i].charAt(j) == '0') {
        		   answer[i] += " ";
        		}
        	}
        }
        return answer;
    }
}

 

 

다른 사람 풀이

Integer.toBinaryString( | ) → 이렇게 쓰면 양 옆 중 하나만 1이어도 1을 반환해줌, 둘 다 0이어야 0 반환

Integer.toBinaryString( & ) → 이렇게 쓰면 양 옆 다 1이어야 1 반환, 하나만 0이어도 0 반환

이걸로 두 배열 대조를 한 번에 해결

String.format("%" + n + "s", result[i]); 이런 형태를 파이썬인가 C언어에서 본 거 같은데

원랜 String.format("%s", "Ah") 이런 형태면 %s 위치에 Ah가 들어간다.

이 분은 %와 s 사이에 n을 넣었는데 이건 총 자릿수 인듯

이 후에 1은 #, 0은 " "으로 바꿔주었음, 공백 칸은 원래 공백

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]); // 이걸로 1겹치는 곳 다 확인
        }
    
        for (int i = 0; i < n; i++) {
            result[i] = String.format("%" + n + "s", result[i]); // % s 사이의 숫자는 총 자릿수
            result[i] = result[i].replaceAll("1", "#");
            result[i] = result[i].replaceAll("0", " ");
        }

        return result;
     }
}

댓글