1. 문제 설명
2. 문제 풀이 핵심이라 생각하는 점
- 2진수 변환 개념
- 2개의 지도에서 1개라도 막혀있으면 #으로 표시
- 막혀있는 기준은 2진수로 표현하였을 시 그 칸의 값이 1이라면 막혀있다고 표시됨
- 즉, 해당 자리 수의 값을 2로 나눈 나머지가 0이 아니라면 막혀있는 것(#)이라고 이라고 판단해서 풀이함
3. 정답 코드 확인 및 활용 메소드 체크
3-1 : 정답 코드 확인
- StringBuilder.append() : 사용했더니 기본 문자열의 뒤로 붙여지는 문제점 만남
- StringBuilder.insert(index, value)를 사용하여서 해결
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
StringBuilder temp = new StringBuilder();
for (int i = 0; i < n; i++) {
//2개의 지도에서 모두 막혀있지 않다면 " " 하나라도 막혀있다면 "#"
//StringBuilder.insert() 로 문자열 뒤쪽이 아닌 앞쪽으로 추가(자릿수 이동)
for(int j=0; j<n; j++) {
if(arr1[i]%2 == 0 && arr2[i]%2 == 0) {
arr1[i] /= 2;
arr2[i] /= 2;
temp.insert(0," ");
}else {
arr1[i] /= 2;
arr2[i] /= 2;
temp.insert(0,"#");
}
}
//i의 수 만큼 반복하여 추가 + StringBuilder 초기화
answer[i]=temp.toString();
temp.setLength(0);
}
return answer;
}
}
3-2 : 활용 메소드 체크
- StringBuilder.insert(index, value) : 지정한 위치에 문자열을 추가 ( 추가할 위치의 값은 0부터 시작 )
- StringBuilder.toString() : StringBuilder의 값을 String으로 변환
4. 공부하고 싶은 다른 분의 풀이
- 재귀 함수와 비트 연산을 활용하여 풀이하셨다.
- 재귀 함수는 언제 봐도 어렵고..
- 비트 연산에 대해서는 공부해 보아야겠다.
class Solution {
public String makeSharp(int n, int m) {
if(n == 0) {
if( m > 0) {
String str = "";
for(int i = 0; i < m; i++) {
str += " ";
}
return str;
}
else return "";
}
else {
return n % 2 == 0 ? makeSharp(n/2, m-1) + " " : makeSharp(n/2, m-1) + "#";
}
}
public String[] solution(int n, int [] arr1, int [] arr2) {
String [] answer = new String[n];
int [] secretMap = new int[n];
for(int i = 0; i < n; i++) {
secretMap[i] = arr1[i] | arr2[i];
answer[i] = makeSharp(secretMap[i], n);
}
return answer;
}
}
'Programmers > JAVA' 카테고리의 다른 글
[ 프로그래머스 ] 가장 가까운 같은 글자 - Java (0) | 2023.01.13 |
---|---|
[ 프로그래머스 ] JadenCase 문자열 만들기 - Java (0) | 2023.01.10 |
[ 프로그래머스 ] 마법의 엘리베이터 - Java (0) | 2023.01.06 |
[ 프로그래머스 ] 숫자 문자열과 영단어 - Java (0) | 2023.01.06 |
[ 문자열 중복제거 ] , [ 문자배열 중복제거 ] (0) | 2022.12.31 |