JAVA/Algorithm

[프로그래머스/java] 비밀지도 (2018 KAKAO BLIND 1차)

nang. 2020. 12. 18. 16:54
반응형
SMALL

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

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

 

  • 10진수를 2진수로 바꿔주는 함수
    • Integer.toBinaryString()
    • 비트연산 가능

 

 

  • 비트연산
    • | (OR)
      • 둘 중 하나라도 1이면 1, 아니면 0
      • ex)
        • Integer.toBinaryString(9 | 3);
    • & (AND)
      • 둘 모두 1이면 1, 아니면 0
    • ^ (XOR)
      • 둘 다 다를 때 1
    • ~
      • 비트 전환 연산자
      • 1이면 0, 0이면 1

 

 

 

  • 속도가 다소 느림
class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        
        /* 비트연산
        Integer.toBinaryString()을 이용하여 10진수를 2진수로 변환한다.
        (a | b) 일 때 둘을 비교하여 하나라도 1이면 1, 아니면 0으로 변환한다.
        */
        for(int i = 0; i < n; i++) {
            answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }
        
        for(int i = 0; i < n; i++) {
            /* "%숫자s" 이면 숫자 자리수 위치에 맞춰서 들어감
            예를들어 ("%7s", "KAKAO") 이면 >> "  KAKAO"
            여기서 해주는 이유는 Integer 형태였던 숫자를 한자리씩 문자열로 변환해서 넣어주기 위함
            */
            answer[i] = String.format("%" + n + "s", answer[i]); 
            
            answer[i] = answer[i].replace("1", "#");
            answer[i] = answer[i].replace("0", " ");
        }
        
        return answer;
    }
}

 

 

 

  • 다른 풀이
class Solution {
  public String[] solution(int n, int[] arr1, int[] arr2) {
      String[] answer = new String[n];
      int[] temp = new int[n];

      for(int i = 0 ; i < n ; i++){
          String resultStr = "";
          int target = 1;
          int arr = arr1[i] | arr2[i];
          
         for(int j = 0 ; j < n; j++){
             resultStr = ((arr & target) == 0 ? " " : "#") + resultStr;
             target = target << 1;
         }
          
          answer[i] = resultStr;
      }

      return answer;
  }
}
반응형
LIST