DEV/알고리즘

[프로그래머스 Lv.1] 비밀지도 java

Imvory 2020. 11. 27. 14:15

문제설명

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

 

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

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

programmers.co.kr

 

입출력 예제

매개변수
n 5
arr1 [9, 20, 28, 18, 11]
arr2 [30, 1, 21, 17, 28]
출력 ["#####","# # #", "### #", "# ##", "#####"]

 

매개변수
n 6
arr1 [46, 33, 33 ,22, 31, 50]
arr2 [27 ,56, 19, 14, 14, 10]
출력 ["######", "### #", "## ##", " #### ", " #####", "### # "]

 

Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        String[] map = new String[n];
 
        for(int i=0; i<n; i++) {
            map[i] = String.format("%0"+n+"d", Long.parseLong(Integer.toBinaryString(arr1[i]|arr2[i])));
        }
 
        for(int i=0; i<map.length; i++) {
            String m = map[i];
            String str = "";
            for(int j=0; j<m.length(); j++) {
                if(m.charAt(j)=='1') {
                    str += "#";
                }else {
                    str += " ";
                }
            }
            answer[i] = str;
        }
        return answer;
    }
}
cs

 

1. 두 배열을 OR연산하여 map에 담아주고

2. map에 있는 문자를 쪼개서 1이면 "#" 0이면 공백을 주어 String에 더해서 answer배열에 담았다.

 

처음엔

map[i] = Integer.toBinaryString(arr1[i] | arr2[i]);

이렇게 했더니 2진수변환할때 앞이 0이면 0을 빼고 출력해서 원하는 답이 나오지 않았다.

 

그래서 String.format을 이용하는 방법을 찾았다

map[i] = String.format("%0"+n+"d", Integer.parseInt(Integer.toBinaryString(arr1[i]|arr2[i])));

% : 명령 시작 의미

0 : 채워질 문자

n : 총 자릿수

d : 정수

 

하지만 2,6번에서 런타임에러가 났는데 int형 범위를 초과하여 난 에러였다.

map[i] = String.format("%0"+n+"d", Long.parseLong(Integer.toBinaryString(arr1[i]|arr2[i])));

그래서 Long타입으로 바꿔주어 해결!

 

다른사람풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
    }
}
 
cs

같은 방법을 좀 더 깔끔하게 한 느낌

특히 replaceAll은 생각이 안났었는데 좋은 방법인듯

반복문 한번으로 해결되니까 :)