728x90
📌 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 개요
두 개의 지도를 겹쳐서 하나의 비밀지도를 만드는 문제다.
각 지도는 정수 배열로 주어지고, 각 정수를 이진수로 변환했을 때 1은 벽, 0은 공백을 의미한다.
두 지도 중 하나라도 벽인 위치는 최종 지도에서도 벽 #이 되고, 두 지도 모두 공백인 위치만 공백 " "이 된다.
📌 접근 방법
이 문제는 두 지도를 한 줄씩 비교하면 된다.
예를 들어 첫 번째 줄이 다음과 같다고 하면,
arr1 = 01001
arr2 = 11110
두 지도 중 하나라도 1이면 벽이므로 OR 연산을 사용한다.
01001
11110
-----
11111
결과 이진수에서 1은 #, 0은 공백으로 바꾸면 된다.
📌 핵심 아이디어
핵심은 arr1[i] | arr2[i]이다.
String binary = Integer.toBinaryString(arr1[i] | arr2[i]);
|는 비트 OR 연산자 : 두 비트 중 하나라도 1이면 결과가 1이 된다.
따라서 두 지도 중 하나라도 벽인 위치를 자연스럽게 찾을 수 있다.
다만 Integer.toBinaryString()은 앞자리 0을 제거한다.
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
예를 들어 9를 이진수로 바꾸면 01001이 아니라 1001이 나온다.
그래서 지도 크기 n에 맞게 앞쪽에 0을 채워야 한다.
while (binary.length() < n) {
binary = "0" + binary;
}
📌 전체 코드
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
for (int i = 0; i < n; i++) {
String binary = Integer.toBinaryString(arr1[i] | arr2[i]);
while (binary.length() < n) {
binary = "0" + binary;
}
answer[i] = binary.replace("1", "#")
.replace("0", " ");
}
return answer;
}
}
📄 정리
이 문제는 비트 OR 연산을 이해하면 간단하게 풀 수 있다.
두 지도를 직접 문자 단위로 비교하지 않고, 숫자 상태에서 OR 연산을 먼저 수행하면 벽이 있는 위치를 한 번에 구할 수 있다.
이후 이진수 문자열로 변환하고, 1은 #, 0은 공백으로 치환하면 최종 비밀지도를 만들 수 있다.
728x90
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 프로그래머스 시험장 나누기 JAVA 풀이 (이분 탐색, DFS, 트리) (0) | 2026.06.10 |
|---|---|
| 프로그래머스 문자열 나누기 JAVA 풀이 (문자열, 구현) (0) | 2026.06.09 |
| 프로그래머스 모의고사 JAVA 풀이 (완전탐색) (0) | 2026.06.06 |
| 프로그래머스 명예의 전당 (1) JAVA 풀이 (우선순위 큐, PriorityQueue) (0) | 2026.06.05 |
| 프로그래머스 콜라 JAVA 풀이 (구현, 시뮬레이션) (0) | 2026.06.04 |