✔ 비밀지도
문제 분석하기
반복문을 통해 두 배열의 값을 하나씩 가져와 이진수로 변환하고,
이진수의 값이 1이라면 정답 배열에 #을, 아니라면 공백을 추가하도록 함
손으로 풀어보기
- 반복문을 통해 두 배열의 값을 하나씩 가져와 이진수로 변환
- 현재 값을 2로 나눈 값의 나머지 값을 저장하고, 값을 2로 나눈 값으로 현재 값을 갱신
- 이진수로 변환한 값의 길이가 n보다 작다면 자릿수를 채우기 위해 0을 앞에 추가
- 예) 9
9 % 2 = 1 -> 1
9 / 2 = 4, 4 % 2 = 0 -> 01
4 / 2 = 2, 2 % 2 = 0 -> 001
2 / 2 = 1, 1 % 2 = 1 -> 1001
1 / 2 = 0
0 + 1001 -> 01001
- 두 배열 중 하나라도 이진수의 값 위치가 1이라면 정답 배열이 #을 추가, 아니라면 공백을 추가
- 정답 배열 반환
슈도코드 작성하기
n(지도의 한 변 크기)
arr1, arr2(정수 배열)
answer(해독된 비밀지도)
for(i -> n만큼) {
c1(arr1[i]의 값을 이진수로 변환한 문자열) = 이진수 변환 함수(arr1[i], n)
c2(arr2[i]의 값을 이진수로 변환한 문자열) = 이진수 변환 함수(arr2[i], n)
s(answer의 한 줄 문자열)
for(j -> n만큼) {
if(c1의 j 또는 c2의 j가 1이라면)
s += "#"
else
s += " "
}
answer[i] = s
}
answer 반환
이진수 변환 함수 {
s(이진수 변환 문자열)
while(현재 값(num)이 0이 아닐 동안) {
s = num % 2 + s
num = num / 2
}
if(s의 길이가 n이 아니라면) {
s = "0"를 n - s의 길이만큼 반복 + s
}
s 반환
}
코드 구현하기
/**
* 17681) 비밀지도
*/
public class L034_17681 {
// n(지도의 한 변 크기)
// arr1, arr2(정수 배열)
public String[] solution(int n, int[] arr1, int[] arr2) {
// answer(해독된 비밀지도)
String[] answer = new String[n];
for (int i = 0; i < n; i++) {
// c1(arr1[i]의 값을 이진수로 변환한 문자열)
String c1 = convert(arr1[i], n);
// c2(arr2[i]의 값을 이진수로 변환한 문자열)
String c2 = convert(arr2[i], n);
// s(answer의 한 줄 문자열)
String s = "";
for (int j = 0; j < n; j++) {
// 1의 j 또는 c2의 j가 1이라면
if (c1.charAt(j) == '1' || c2.charAt(j) == '1')
// s에 # 추가
s += "#";
// 1의 j 또는 c2의 j가 0이라면
else
// s에 공백 추가
s += " ";
}
// s 저장
answer[i] = s;
}
// answer 반환
return answer;
}
// 이진수 변환 함수
// 또는 Integer.toBinaryString() 사용
private String convert(int num, int n) {
// s(이진수 변환 문자열)
String s = "";
// 현재 값(num)이 0이 아닐 동안
while (num != 0) {
s = num % 2 + s;
num = num / 2;
}
// s의 길이가 n이 아니라면
if (s.length() != n) {
// "0"를 n - s의 길이만큼 반복하여 자릿수를 채워줌
s = "0".repeat(n - s.length()) + s;
}
// s 반환
return s;
}
// 테스트 케이스
public static void main(String[] args) {
L034_17681 solution = new L034_17681();
int n = 5;
int[] arr1 = { 9, 20, 28, 18, 11 };
int[] arr2 = { 30, 1, 21, 17, 28 };
String[] result = solution.solution(n, arr1, arr2);
System.out.println(Arrays.toString(result));
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[42889] 실패율 (0) | 2023.12.30 |
---|---|
[17682] 다트 게임 (0) | 2023.12.29 |
[12982] 예산 (0) | 2023.12.29 |
[12977] 소수 만들기 (0) | 2023.12.29 |
[12969] 직사각형 별찍기 (0) | 2023.12.29 |