자바 초급문제로 맨땅에 해딩하기

자바 초급문제 25. 비밀지도

Jungsoomin :) 2020. 4. 14. 01:41

프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/42889)

자바 초급문제의 2019 KAKAO BLIND RECRUITMENT 1차의 비밀지도 이다.

 

완료하는데는 30~40분 정도 걸린 듯하다. 일단..보는 순간에는 비트논리 연산자가 생각이났다. 어느 분이셔도 이 문제를 접하신다면 그런 생각이 드시지않을까 생각을 조심스레 해본다.

 

비트논리 연산자의 논리합 연산자인 | 를 사용해서 0 0 일때만 0이 도출되도록 만들었다. 비트논리 연산자 관련해서 교재를 찾아보다가 

toBinaryString()을 이용해서 이진수로 만들고 주의할 점인 숫자를 식별할 수 있는 이진수 값만 준다는 점을 보고 while 문을 돌려서 n의 길이만큼 0을 추가시켰다. 당연하게도 자신의 부족한 실력과 경험으로는 바로 모든 과정을 완성한 것은 참...기적같은 일이 아닌가 싶고..그만큼 배울기회가 적어지는게 아닐까 싶은 느낌이 든다. 난 아직 많이 부족해서, 많이 배우고 찾아가고 싶다. 전 문장에서 기술한 0을 추가시키는 것을 어려워하는 과정에서 자연스레 시간을 소모하게 되었다. 

 

이번에도 char 값으로 로직을 짜내려갔다. 숫자가 정해져있어 공백인32 #인 35를 이용하게 되었다.

요즈음에는 'for문안에서 최대한 로직을 유려하게 꾸릴 수는 없을까...' 하고서 고민을 참 많이하게된다. 'for문안에서 할 수 있는 일들은 다 끝내보자 '라는 마음가짐으로 코딩해나가다보니 객체생성의 부분도 그 처리과정도 바뀌게 된 듯 싶다.

 

이런 사고들은 사실 마지막에 answer에 넣을때 null값을 생각을 못해서 처음에는 String으로 마무리지으려다가 난관에 빠지고 나서 길을 돌아가게 된 과정이다. char배열로 저장해서 하나의 #와 공백을 채워넣고 그것을 복사하여 String 타입으로 넣어주고자 하는 과정에서 생긴 로직이라고 봐주시면 될 듯하다. 시행착오가 많다는게 오히려 감사한 마음이 많이든다. 그만큼 더 볼 수 있는 것이 늘어나고 찾으려하는 것들이 늘어난다는 것이 고마운 사건이라고 생각하고 있다.

 

맞추고 좋아하면서 "1차 합격이다,ㅎㅎㅎ!" 하니 주위에서 "웃기는 이야기를 한다." 며 웃었다. 그 과정에서 나도 미소지으며 소소하게 기뻐하고 있더라.  맞다, 당연히 스스로도 알고있고 당연한 일이지만은 나는 "웃기는 이야기"라는 말을 듣고 싶었다. 그렇게 소소하게 기뻐하며 미소를 짓고 싶었나 보다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package programmers_비밀지도;
 
public class subClass {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];// 변만큼 배열
        // arr에는 각 수가 있다.
        // arr2도 동일
        // arr과 arr2의 이진수를 비트논리 연산자로 검사해서 두값 다 0일때 " " 으로 하나라도 1이면 #으로 놓아주면 될듯
        int[] list = new int[n];
        int count = 0;
        char[] bina;
 
        for (int i = 0; i < n; i++) {// arr1과 arr2도 동일
            list[i] = arr1[i] | arr2[i]; // 논리합 비트 연산자
 
            String check = Integer.toBinaryString(list[i]);// 이진수 변환
            while (check.length() < n) {
                check = "0" + check;
            }
            // System.out.println(check);
            bina = new char[check.length()];// <<넣어줄 배열
            for (int j = 0; j < check.length(); j++) {// 이진수 검사, 0은 48 1은 49
                if (check.charAt(j) == 48) {// 0이라면 공백넣기
                    bina[count] = 32;
                    count++;
                } else if (check.charAt(j) == 49) {// 1이라면 #넣기
                    bina[count] = 35;
                    count++;
                }
                if (count == check.length()) {
                    count = 0;
                    continue;
                } // <
 
            }
            answer[i] = String.copyValueOf(bina);
            // System.out.println(answer[i]);
        }
 
        return answer;
    }
}
 
cs