https://school.programmers.co.kr/learn/courses/30/lessons/17681
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
매개변수 | 값 |
---|---|
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] |
출력 | ["######", "### #", "## ##", " #### ", " #####", "### # "] |
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
int[] arr = new int[n];
String[] result = new String[n];
//비트 연산 중 OR 연산이 필요한 문제
//주어진 배열의 원소끼리 index에 맞게 OR 연산 수행 뒤
//arr 배열에 넣는다
//결과 배열은 빈 문자열 ""로 초기화
for (int i = 0; i < n; i++) {
arr[i] = arr1[i] | arr2[i];
result[i] = "";
int length = n - binary(arr[i]).length();
>
//만약 주어진 n이 6인데 원소의 값이 32(2^5)보다 작을 경우
//첫째자리의 공백이 생략되므로
//arr 배열의 원소의 길이가 n보다 작을 경우 작은 만큼 공백을 추가한다
for (int j = 0; j < length; j++) { result[i] += " "; }
>
//OR 연산을 수행한 값을 2진수로 변환하고
//모든 1을 #으로 대체한 반환값을 결과 배열의 원소에 더한다
//그리고 모든 0은 공백으로 대체
result[i] += binary(arr[i]).replaceAll("1", "#");
result[i] = result[i].replaceAll("0", " ");
}
return result;
}
//주어진 n을 2진수로 변환한 뒤 String 값으로 반환
public String binary(int n) {
StringBuilder sb = new StringBuilder();
while (n > 0) {
sb.append(n % 2);
n /= 2;
}
return sb.reverse().toString();
}
}
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] result = new String[n];
//toBinaryString 메소드를 이용해 OR 연산을 2진수로 변환
//나머지는 동일
for (int i = 0; i < n; i++) {
String toBinary = Integer.toBinaryString(arr1[i] | arr2[i]);
result[i] = "";
int length = n - toBinary.length();
for (int j = 0; j < length; j++) {
result[i] += " ";
}
result[i] += toBinary.replaceAll("1", "#");
result[i] = result[i].replaceAll("0", " ");
}
return result;
}
}
이 문제는 2018 KAKAO BLIND RECRUITMENT의 1번 문제라는데
LV.1이다 보니 크게 어렵진 않았다.
하지만 무조건 각 원소가 주어진 n의 길이가 되어야 하기 때문에 고민이 좀 필요했었다.
나는 처음에 정수 값을 String 2진수 값으로 변환하기 위해
따로 메서드를 만들었었는데
다른 사람의 풀이를 보다 보니 Integer클래스에 toBinaryString 메서드가 이미 있었다 ㅎ..
그리고 추천이 높은 풀이엔 String.format("%"+n+"s", 배열의 원소)로
길이를 지정했던데 생각지 못한 방법이지만
속도가 많이 느리길래 따로 기록은 하지 않았다.