본문 바로가기

알고리즘 풀이/프로그래머스

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

🔗 문제 링크

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

 

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

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

programmers.co.kr

 

📝 풀이 과정

지도 두 장을 겹쳐 둘 중 하나라도 벽('1')일 경우 결과 값에 벽('1')이 나오는 것을 보고 OR연산이 떠올랐다.

1010 | 1100 = 1110

 

 

 

Integer.toBinaryString(arr1[i] | arr2[i]).replace('1', '#').replace('0', ' ')

입력은 정수 배열의 형태로 들어오기 때문에 하나씩 OR(|)연산을 통해 결과 지도의 값을 만들어 준다.
Java에는 Integer.toBinaryString()이라는 함수가 존재하는데, 이를 사용하면 쉽게 10진수의 숫자를 2진수 형태의 String으로 변경시켜준다.


이후, String.replace()를 사용해 1 → '#'으로, 0 → ' '으로 출력 값에 맞게 변경시켜준다.

아직 문제가 존재하는데, OR연산의 결과의 앞자리 숫자가 0일 경우다. 만약 n = 5에서 OR연산을 통해 나온 값이 1010이고, replace해준다면 '#_#_'이 된다. 이 경우에는 결과값으로 원하는 '_#_#_'과 불일치하게 되는데 해당 문제를 String.format()으로 해결할 수 있다.

 

String.format()으로 String에 강제적으로 길이에 맞는 공백을 앞에 넣어줌으로써 해결할 수 있게 된다.
%[num]s는 String의 길이가 num보다 부족할 경우 앞을 공백으로 채워 길이를 num까지 늘리게 해준다.

 

💻 코드

class Solution {
  public String[] solution(int n, int[] arr1, int[] arr2) {
    String[] ans = new String[n];

    for (int i = 0; i < n; i++)
      ans[i] = String.format("%" + n + "s", Integer.toBinaryString(arr1[i] | arr2[i]))
        .replace('1', '#').replace('0', ' ');

    return ans;
  }
}