본문 바로가기

CS/알고리즘 풀이

[ 프로그래머스- 2018 카카오 공채 ] 비밀지도 (java)

[ 프로그래머스 2018 카카오 공채 ] 비밀지도 (자바)

 

두 지도를 or 연산하고 다시 원래의 지도 만들기 

 

 

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

 

코딩테스트 연습 - [1차] 비밀지도 | 프로그래머스

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 공백(" ) 또는벽(#") 두 종류로 이루어져 있다. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 지도 1과 지도 2라고 하자. 지도 1

programmers.co.kr

카카오 해설 

https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/

 

카카오 신입 공채 1차 코딩 테스트 문제 해설

‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인으로 치러졌습니다. 지원자들의 개발 능력을 잘 검증하기 위해 출제 위원들이 한 땀 한 땀 독창적이고 다양한 문제들을 만들어 냈고 문제에 이상은 없는지, 테스트케이스는 정확한지 풀어보고 또 풀어보며 […]

tech.kakao.com

 

 

핵심 

OR 연산을 처리한 숫자를 다시 지도로 만들때 제일 왼쪽처리합니다. 

 

예를 들면, 지도 길이가 4이고 OR연산 결과가 2라면, [ 0 0 1 0 ] 이 저장되어야 합니다.

따라서, 연산을 2진법으로 바꾼 결과에서 1을 #으로, 빈 칸을 0으로 대체하면 됩니다.

 

 

방법 1

두 지도를 OR 연산 후 문자열 처리 

String.format 사용해서 문자열 형식을 바꿉니다.

 

+ String.format이란, 문자열에서특정 위치에 값을 대입해 새로운 문자열을 만드는 함수입니다.

여기서 사용한 방법은 String.format("%"+너비+"s", 값); 으로 너비 옵션을 이용했습니다.

%s는 문자열 값이 들어오는 것을 의미하며, %너비s는 너비만큼 고정된 문자열에 값이 들어오는 것을 의미합니다. 

 

예를들면, String.format("%5s", 123);  의 결과는 

"  123" 이 나오게 됩니다. 문자열 길이 5에 앞 2자리는 빈 칸으로 남겨지고 123은 뒤에서부터 채워집니다. 

 

 

문자열 형식을 바꾸면, 예시로 길이가 3이어야 하는 이진법 10은 " 10" 가 됩니다. 

그리고, 스트링의 기본 함수 replace를 이용하여 0은 빈 칸으로, 1은 #으로 바꿔주면 됩니다.

 

10 - > " 10" -> " # " 로 바뀌게 됩니다. 

 

 

 

 

방법 2

두 지도에서 OR연산합니다. 

그리고, 답 문자열에는 연산 값에서 2진법을 구하면서 1에는 #, 0에는 빈 칸을 저장합니다. 

하지만, 길이 n을 맞춰야 하므로, 답 문자열이 길이 n이 될 때까지 빈 칸을 추가합니다. 

 

두 지도를 or 연산

for ( 모든 지도 row에 대해  )

    // 2진법을 구합니다. 2로 나눈 나머지가 0이면 빈 칸, 1이면 # 추가 

    for( 지도 값 != 0 )

        답에 (지도 % 2 == 1? # : ' ')추가 
        지도 값 /= 2

 

    // 답 길이가 N이 되도록 남은 영역에 빈 칸을 추가합니다. 

    for( 남은 지도 )

        답 <- ' ' 추가 

 

 

 

 

 

추가적으로 더 궁금한 점 있으면 댓글 달아주세요

 

 

 

 

 

코드 1 ( OR 연산 결과를 문자열로 처리)

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[] map = new String[n];
        for(int i = 0 ; i < n ; i++) {
            map[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }
        String[] ans = new String[n];
        int row, index;
        for(int i = 0 ; i < n ;i++) {
            map[i] = String.format("%" + n + "s", map[i]);
            map[i] = map[i].replace('1''#');
            map[i] = map[i].replace('0'' ');
        }
        return map;
    }
}
 
cs

 

 

코드 2 ( OR 연산 결과를 숫자 그대로 처리)

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
class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        int[] map = new int[n];
    
        for(int i = 0 ; i < n ; i++) {
            map[i] = (arr1[i] | arr2[i]);
        }
    
        String[] ans = new String[n];
        int index; // 지도에서 채워지는 위치 
        for(int i = 0 ; i < n ; i++) {
            ans[i] = "";
            index = n-1;
            // 연산 결과 처리 
            while(map[i] != 0) {
                ans[i] = (map[i]%2 == 1 ? "#" : " "+ ans[i];
                map[i] /= 2;
                index--;
            }
            // 연산결과 처리 후 남은 공간 마저처리
            while(index >= 0) {
                ans[i] = " " + ans[i];
                index--;
            }
        }
        return ans;
    }
}
cs