
문제설명



입력 & 출력

나의 풀이
import java.util.*;
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;
}
StringBuilder sb = new StringBuilder();
for(int j = 0 ; j < n ; j++){
if(binary.charAt(j) == '1'){
sb.append("#");
}else{
sb.append(" ");
}
}
answer[i] = sb.toString();
}
return answer;
}
}
이번 문제는 문제 설명이 좀 길지만 숫자로 암호화된 지도 1과 지도 2가 주어졌을 때 두 개의 지도를 하나의 "전체 지도"로 합치는 데 이때 해당 숫자를 이진법으로 변환한 뒤 "1"이면 벽 # "0"이면 공백을 출력하면 되는 문제입니다.
지도 1과 지도 2중 둘 중 하나라도 벽인 부분은 전체 지도에서 벽이라는 것을 주의하고 풀면 어렵지 않게 풀 수 있습니다.
예를 들어 지도 1의 첫 번째 줄이 "01001"이고, 지도 2의 첫 번째 줄이 "11110"이라면 전체 지도의 첫 번째 줄은 "11111"로 합쳐집니다.
먼저 처음에는 정수 9 ➡️ "1001"이기 때문에 정수 배열을 한번 전체적으로 순회를 한 뒤 가장 긴 길이를 구하고, 해당 길이가 아니라면 앞에 "0"을 채워주는 식으로 진행을 했었는데 다시 한번 생각을 해보니 지도의 한 변의 길이 n이 주어졌기 때문에 해당 작업은 필요가 없습니다.
다시 코드를 설명하자면 먼저 전체 지도의 크기만큼 answer 배열을 초기화를 해줍니다.
그리고 for문 안에서 Integer.toBinaryString() 메서드를 사용하여 이진수로 바꿔주는 데 여기서 OR연산자를 사용하여 두 비트 중 하나라도 벽이면 벽으로 만듭니다.
정수형 상태에서 OR 연산 수행
- arr1[i] | arr2 [i]는 정수형의 OR 연산을 수행합니다.
- 예를 들어, arr1[i]가 9(이진수 1001)이고 arr2 [i]가 30(이진수 11110)이라고 가정합니다.
- 9 | 30는 31이 됩니다. (이진수로 11111)
즉 + 연산이 아니고, 비트 연산의 OR 연산이기 때문에 9 | 30 ➡️ 31(11111) 이 저장되게 됩니다.
그리고 9 ➡️ 1001 이므로. 길이가 1모자랍니다. 따라서 길이가 모자란 부분을 앞에 0을 추가해 주는 작업을 실행해야 합니다. 해당 작업을 while문에서 수행합니다.
해당 작업은 if문으로도 해결할 수 있습니다.
if (binary.length() < n) {
binary = "0".repeat(n - binary.length()) + binary;
}
마저 코드를 설명하자면 전체 지도를 저장할 StringBuilder를 선언해주고, for문을 통해서 전체 지도의 숫자 문자열 즉 암호화된 전체 지도를 순회합니다.
각 문자에 접근을 하기 위해서 charAt() 메서드를 사용하고, 해당 요소가 '1'이라면 벽이라는 의미기 때문에 전체 지도에 벽 #을 추가해 주고 아니라면 공백 " "을 저장해 줍니다.
위 작업까지 한다면 전체 지도의 한 줄을 완성한 것이기 때문에 앞서 전체 지도의 answer배열에 한 줄씩 추가해 주어 마무리해 줍니다.
참고 ❗
[JAVA] char에서 String으로 변환하기 (value of() , charAt())
charAt() 란 ❓Java String 클래스에는 charAt()라는 메서드가 있습니다. charAt() 메서드는 문자열의 지정된 인덱스에 있는 문자(char)를 반환합니다. 문자열에서 원하는 문자(char)를 뽑을 때 자주 사용
pixx.tistory.com
[JAVA] 입출력, BufferedReader, StringTokenizer, StringBuilder 알아보기
Java로 코딩테스트를 보거나 입력을 사용해야 할 때 Scanner 클래스를 사용하면 편리하지만 속도가 느리다는 단점이 있습니다. 그렇기 때문에 속도가 빠른 BufferReader 클래스를 사용을 하면 시간복
pixx.tistory.com
[Java] toBinaryString(), toHexString(), toOctalString() , parseInt() 알아보기 (n진법 변환)
Java를 다루거나, 코딩 테스트를 준비하다 보면 정수형 숫자를 n진수 문자열로 변환해야 하는 일이 종종 있습니다. Java에서는 toBinaryString(), toHexString(), toOctalString()이라는 정수를 n진수 문자열로
pixx.tistory.com
'Coding Test > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] Lv2. 전화번호 목록 (HashSet, startsWith, Java) (0) | 2024.06.11 |
|---|---|
| [프로그래머스] Lv.2 영어 끝말잇기 (contains(), charAt(), ArrayList, Java) (0) | 2024.06.10 |
| [프로그래머스] Lv.2 이진 변환 반복하기 (toBinaryString, chars(), stream.count(), Java) (1) | 2024.06.08 |
| [프로그래머스] Lv.1 예산 (greedy, 탐욕, 그리디 알고리즘, Java) (0) | 2024.06.08 |
| [프로그래머스] 없는 숫자 더하기 (Arrays.stream() anyMatch, sum(), Java) (1) | 2024.06.08 |