카카오 코딩테스트 문제1 Java, Python

오늘 프로그래머스에서 카카오 블라인드 채용 테스트를 했다.
저는 굉장히 허접이라서 경험삼아 도전해 보았는데, 문제1번만 풀었다..
문제는 총 7문제이고 언어는 C++, Java, Python, JavaScript, Swift 이렇게 5개로 풀 수있다.
그래서 총 7 x 5 = 35 문제라고 할 수 있다.
문제1번을 Java랑 Python 2가지 언어로 풀었는데, 1시간 30분 걸렸다...
총 5시간 300분 중에 90분을 썼는데, 2가지 언어로 풀고 나니까 현자타임(?)이 와서 그만 두었다. 그래서 제가 java,python으로 푼 1번 문제 코드만 블로깅 해볼려고 합니다.

1번문제는 아래와 같아요.
이거를 그대로 써도 될지 잘모르겠는데,, 저작권같은거에 걸릴까봐 겁나긴 하는데
그냥 올려봅니다.

출처: <https://programmers.co.kr/tryouts/1255/challenges/4412?language=java

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


네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입력 형식
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
  • 1 ≦ n ≦ 16
  • arr1, arr2는 길이 n인 정수 배열로 주어진다.
  • 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.
출력 형식
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
입출력 예제
매개변수
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]
출력
["######", "### #", "## ##", " #### ", " #####", "### # "]



먼저 Java코드


class Solution {
  public String[] solution(int n, int[] arr1, int[] arr2) {
      String[] answer = new String[n];
      String[] map1 = new String[n];
      String[] map2 = new String[n];
      
      for (int i =0; i<map1.length; i++){
     map1[i] = Integer.toBinaryString(arr1[i]);
     while(map1[i].length()<n){
  map1[i] = "0" +map1[i];
  }
       
     }
     for(int i = 0; i<map2.length; i++){
         map2[i] = Integer.toBinaryString(arr2[i]);
         while(map2[i].length()<n){
  map2[i] = "0" +map2[i];
  }
     }
      char[] result = new char[n];
     for (int i=0; i<map1.length; i++){
     
     char[] temp = map1[i].toCharArray();
     char[] temp2 = map2[i].toCharArray();
     for(int a =0; a<temp.length; a++){
     if(temp[a]=='1'|| temp2[a]=='1'){
     result[a]='1';
     }else if(temp[a]=='0'&& temp2[a]=='0'){
     result[a]='0';
     }
     }
     
     String s =new String(result);
     answer[i]=s;
     }
      
      for(int i=0;i<answer.length; i++){
     char[] temp = answer[i].toCharArray();
     for(int a =0; a<temp.length;a++){
     if(temp[a]=='1'){
     temp[a]='#';
     }else if(temp[a]=='0'){
     temp[a]=' ';
     }
     String s = new String(temp);
     answer[i] =s;
     }
     
     }
      
      
      
      return answer;
  }
}




그 다음 python 코드

def solution(n, arr1, arr2):
    answer = []
    for i in range(0,len(arr1)):
        arr1[i] = bin(arr1[i])
        arr1[i] = arr1[i][2:]
        if(len(arr1[i])<n):
            while(len(arr1[i])<n):
                arr1[i] = "0"+arr1[i]
    for i in range(0,len(arr2)):
        arr2[i] = bin(arr2[i])
        arr2[i] = arr2[i][2:]
        if (len(arr2[i]) < n):
            while (len(arr2[i]) < n):
                arr2[i] = "0" + arr2[i]
    for i in range(0,n):
        temp = ""
        for j in range(0,n):
            if(arr1[i][j]=="1" or arr2[i][j]=="1"):
                temp += "1";
            if(arr1[i][j] =="0" and arr2[i][j] == "0"):
                temp+="0"
        answer.append(temp)
    for i in range(0,n):
        temp =""
        for j in range(0,n):
            if(answer[i][j]=="1"):
                temp += "#"
            if(answer[i][j]=="0"):
                temp += " "
                
        answer[i] = temp
    return answer




==========================================================
일년전 문제를 다시 한 번 풀어봤다.. 지금은 2018.09.15
public static String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
for(int i = 0 ; i<n; i++) {
answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
}
return answer;
}

비트연산을 통해서 스트링으로 변환해주는 작업만 해주는것을 여러개의 for문을
사용해서 짰었던 것을 1년 전만 해도 정말 모르는게 많구나, 그리고 지금도 내가 모르는것들이 많다는것을 느꼈다.

댓글

이 블로그의 인기 게시물

About Kafka Basic

About JVM Warm up

About ZGC

Spring Boot Actuator readiness, liveness probes on k8s

About G1 GC

sneak peek jitpack

About idempotent

C 언어 구조체의 포인터 멤버 변수

Synology NAS에 MariaDB 10에 Mysql workbench로 원격접속하기

About Websocket minimize data size and data transfer cost on cloud