Study/Algorithm

프로그래머스 / 비밀지도(Java)

개발개발개발 2020. 11. 16. 21:06

문제 설명 

암호화된 비밀 지도를 해독하기 위해 지도 1과 지도 2를 합쳐야 한다. 

입력 형식

입력으로 지도의 한 변 크기 n과 2개의 정수 배열 arr1, arr2가 들어온다.

  • 1 ≦ n ≦ 16
  • arr1, arr2는 길이 n인 정수 배열로 주어진다.
  • 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.
매개변수
n 6
arr1 [46, 33, 33 ,22, 31, 50]
arr2 [27 ,56, 19, 14, 14, 10]
출력 ["######", "### #", "## ##", " #### ", " #####", "### # "]

 

내가 생각한 해별 방법 

1. arr1과 arr2의 값을 이진수로 바꾼다.

2. 이진수를 비트 연산(OR)하여 새로운 문자열로 바꾼다.

3. 바꾼 문자열에서 1은 #으로 0은 공백으로 바꾸어 배열에 넣는다. 

★여기서 중요한 것은 바로 N의 값이다.

N은 한 변의 길이를 나타내는데 비트 연산 후에 앞의 자리가 0으로 채워질 수 있다. ex) 000111

그렇기 때문에 n의 길이만큼 앞에 0을 채워 넣어야 한다.!!!!!!!!!!!!!!!!!!!!!!!

 

  public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[arr1.length];
        
        for(int i=0; i<arr1.length;i++) {
        	answer[i] = Integer.toBinaryString(arr1[i]|arr2[i]); //비트연산 후 이진수변환
        	
        	if(answer[i].length()<n) { // 길이가 n보다 작다는 것은 앞의 자리가 0이라는 것
        		int zero = n-answer[i].length();
        		
        		for(int j=0; j<zero; j++) { //차이나는 만큼 0으로 채웠다. 
        		answer[i] = "0"+answer[i];
        		}
        	}
        }
        
        for(int i=0; i<answer.length;i++) {
        	String tmp = "";
        	for(int j=0; j<answer[i].length();j++) {
        		if(answer[i].charAt(j) == '1') {//1이면 # 0이면 공백으로
        			tmp+="#";
        		}else {
        			tmp+=" ";
        		}
        	}
        	answer[i] = tmp;
        }
        return answer;
    }

 

내가 푼 풀이 법

이중 포문을 사용하여 시간 복잡도가 높게 나올 것이라 생각하였다. 하지만 최대 3.31ms로 생각보다 높은 효율성을 보였다.

 

통과 후에 가장 "좋아요"를 많이 받은 사람의 풀이법을 보았는데 나의 코드수보다 1/2 적었다. 

그리고 그 사람의 코드를 돌려보았는데,

좋아요를 가장 많이 받은 풀이 법

최대 약 4.x배 정도의 시간 차이가 났다. 내 추측으론 format 함수를 불러오는 과정에서 많은 시간이 소요될 것이라 생각하였다. 누가 봐도 이 분이 작성한 코드가 훨씬 간결하였으나 시간은 3~4배가량 차이가 난다.

 

이때는 어떤 코드를 선호하는 것이 좋을까?

 

개발자 성향에 따라 다른가????????????