💡풀이
import java.util.Arrays;
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
// 두 배열을 각각 2진수 문자열로 변환
String[] secret1 = toSecret(arr1, n);
String[] secret2 = toSecret(arr2, n);
String[] answer = new String[n];
StringBuilder sb = new StringBuilder();
// 각 행마다 처리
for (int i = 0; i < n; i++) {
// 각 열마다 OR 연산 수행
for (int j = 0; j < n; j++) {
// 둘 중 하나라도 1이면 벽('#'), 둘 다 0이면 공백(' ')
if (secret1[i].charAt(j) == '1' || secret2[i].charAt(j) == '1') {
sb.append("#");
} else {
sb.append(" ");
}
}
answer[i] = sb.toString();
sb.setLength(0); // StringBuilder 초기화
}
return answer;
}
String[] toSecret(int[] arr, int n) {
String s = "%" + n + "s";
return Arrays.stream(arr)
.mapToObj(str -> String.format(s, Integer.toString(str, 2))) // 10진수 → 2진수 문자열
.map(str -> str.replaceAll(" ", "0"))
.toArray(String[]::new);
}
}
💡풀이 2
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
String s = "%" + n + "s";
for(int i=0; i<n; i++){
answer[i] = String.format(s, Integer.toString(arr1[i] | arr2[i], 2))
.replace("0", " ").replaceAll("1", "#");
}
return answer;
}
}
📖새로 배운 부분
핵심 로직 정리
1. 비트 OR 연산으로 한 번에 처리
arr1[i] | arr2[i]
- 두 정수를 비트 단위로 OR 연산
- 두 맵을 비교하지 않고 한 번에 결합
2. 공백 패딩
String s = "%" + n + "s"; // "%5s" 형태
String.format(s, Integer.toString(arr1[i] | arr2[i], 2))
- 2진수 문자열을 n자리로 만들되 부족한 부분은 앞에 공백 추가
- 0 패딩 대신 공백 패딩 사용
3. 문자 치환
.replace("0", " ").replaceAll("1", "#")
- 0 → 공백, 1 → #으로 변환
- 패딩으로 생긴 공백 + 0에서 변환된 공백 = 올바른 공백 문자
...
나 문제를 너무 어렵게 푸나 🥲
세상은 넓고 천재는 많다
GitHub - okjunghyeon/Programmers_CodingTest: 프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다.
프로그래머스 관련 코딩테스트 문제를 풀이한 저장소입니다. Contribute to okjunghyeon/Programmers_CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Programmers' 카테고리의 다른 글
[프로그래머스, Java] 기사단원의 무기 (0) | 2025.07.16 |
---|---|
[프로그래머스, Java] 추억 점수 (0) | 2025.07.16 |
[프로그래머스, Java] 카드 뭉치 (0) | 2025.07.15 |
[프로그래머스, Java] 명예의 전당 (1) (0) | 2025.07.15 |
[프로그래머스, Java] 문자열 내 마음대로 정렬하기 (0) | 2025.07.15 |