[ 프로그래머스 2018 카카오 공채 ] 비밀지도 (자바)
두 지도를 or 연산하고 다시 원래의 지도 만들기
https://programmers.co.kr/learn/courses/30/lessons/17681
카카오 해설
https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/
핵심
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 |
'CS > 알고리즘 풀이' 카테고리의 다른 글
[ 프로그래머스 ] 시저암호 ( java ) (0) | 2019.12.06 |
---|---|
[ 프로그래머스 ] 자연수 뒤집어 배열로 만들기 ( java ) (0) | 2019.12.06 |
[ 프로그래머스 ] 같은 숫자는 싫어 ( java ) (0) | 2019.12.04 |
[ 프로그래머스 ] 문자열 내 마음대로 정렬하기 ( java ) (1) | 2019.12.04 |
[ 백준 17837 ] 새로운 게임 2 (java) (0) | 2019.12.01 |