링크
https://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]
배열의 값을 2진수로 변환 후 지도에 표시
2진수는 1과 0으로 구성.
1과 0은 각각 지도 표기 방법으로 바꿔준다.
1 = "#"
0 = " " (공백)
9를 2진수로 변환하면 1001 라는 값이 나온다.

20을 2진수로 변환하면 10100

위의 9와 20을 2진수로 변환한 값을 보면 자릿수가 다르다.
자릿수를 맞춰주기 위해서는 처음에 받은 n 만큼 자릿수를 채워준다.
그럼 밑의 내용처럼 9를 2진수로 변환한 내용도 바뀐다.
1001 -> 01001

위의 내용대로 arr1 의 값을 2진수로 모두 변환시키면
arr1 = [9, 20, 28, 18, 11]

이렇게 된다.
이 것을 지도로 변환시키면


이렇게 표기가 된다.
arr2도 2진수로 변환
arr2 = [30, 1, 21, 17, 28]

이렇게 된다.
이 것을 지도로 변환시키면


이렇게 표기된다.
그럼 arr1 지도와 arr2 지도의 # 부분을 합집합으로 보여주면 된다.


비밀지도가 완성되었다.
return 방식은 String 배열에 담아서 해준다.
["#####","# # #", "### #", "# ##", "#####"]
위의 로직 구현
class Solution {
/**
* 각 배열의 지도 합치기
* @param str1
* @param str2
* @param n
* @return
*/
public String sumArr(String str1, String str2, int n) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; ++i) {
sb.append(((str1.charAt(i) + str2.charAt(i)) == 96)? " ":"#");
}
return sb.toString();
}
/**
* 각 배열의 자릿수 채워주기
* @param str
* @param n
* @return
*/
public String lpad(String str, int n) {
int size = n - str.length();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size; ++i) {
sb.append("0");
}
return sb.toString()+str;
}
/**
* 카카오 비밀지도
* @param n
* @param arr1
* @param arr2
* @return
*/
public String[] solution(int n, int[] arr1, int[] arr2) {
int arrCount = arr1.length;
String[] arrStr = new String[arrCount];
String[] answer = new String[arrCount];
for (int i = 0; i < arrCount; ++i) {
String str = lpad(Integer.toBinaryString(arr1[i]), n);
StringBuilder sb = new StringBuilder();
for (int j = 0; j < str.length(); ++j) {
sb.append(str.charAt(j));
}
arrStr[i] = sb.toString();
}
for (int i = 0; i < arrCount; ++i) {
String str = lpad(Integer.toBinaryString(arr2[i]), n);
answer[i] = sumArr(arrStr[i], str, n);
}
return answer;
}
}

후기
* 난이도 (5점 만점)
5 : 풀 줄 알면 기업 코딩테스트는 문제 없음.
4 : 평균적인 기업 코딩테스트의 중간 이상.
3 : 평균적인 기업 코딩테스트의 쉬운 문제 .
2 : 알고리즘 문제를 연습하고 있다면 풀 수 있는 문제.
1 : 시간이 오래 걸리지 않고, 누구나 풀 수 있는 문제.
난이도는 생각보다 쉬운 편이었으며 문제를 이해하고 천천히 풀면 충분히 풀 수 있다.
어려운 기술이 들어간 것은 없고, 말 그대로 문제 내용을 하나씩 구현한 것이다.
'카카오코딩테스트 풀이 > 2018' 카테고리의 다른 글
[카카오 코딩 테스트 2018 신입 공채] 캐시 - JAVA 자바 (0) | 2021.08.13 |
---|---|
[카카오 코딩 테스트 2018 신입 공채] 다트 게임- JAVA 자바 (0) | 2021.08.13 |