알고리즘
알고리즘 - 프로그래머스([1차] 비밀지도)
Hyeongjun_Ham
2022. 8. 13. 11:46
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
- 1 ≦ n ≦ 16
- arr1, arr2는 길이 n인 정수 배열로 주어진다.
- 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.
출력 형식
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
입출력 예제
매개변수값
n | 5 |
arr1 | [9, 20, 28, 18, 11] |
arr2 | [30, 1, 21, 17, 28] |
출력 | ["#####","# # #", "### #", "# ##", "#####"] |
매개변수값
n | 6 |
arr1 | [46, 33, 33 ,22, 31, 50] |
arr2 | [27 ,56, 19, 14, 14, 10] |
출력 | ["######", "### #", "## ##", " #### ", " #####", "### # "] |
import java.util.*;
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
//이진수로 바꾸기
List<String> arr1List = toBi(arr1, n);
List<String> arr2List = toBi(arr2, n);
for (int i = 0; i < n; i++) {
String arr1Each = arr1List.get(i);
String arr2Each = arr2List.get(i);
String[] splitArr1 = arr1Each.split("");
String[] splitArr2 = arr2Each.split("");
StringBuilder sb = new StringBuilder();
for (int j = 0; j < n; j++) {
if (splitArr1[j].equals("1") || splitArr2[j].equals("1")) {
sb.append("#");
} else sb.append(" ");
}
answer[i] = sb.toString();
}
return answer;
}
public List<String> toBi(int[] arr, int n) {
List<String> list = new ArrayList<>();
for (int i : arr) {
String bi = "";
while (i > 0) {
bi = i % 2 + bi;
i /= 2;
}
while (bi.length() < n) {
bi = "0" + bi;
}
list.add(bi);
}
return list;
}
}
처음 했던 방법
- int배열을 이진수로 바꿈 (함 수 안에 String으로 붙이게 됨)
- 두개의 배열을 더함 (함수 리턴 값이 List<Integer>였음)
- String으로 바꿈
- String길이가 n보다 작으면 앞에 0추가
- replaceAll() 로 1이상인 것들은 #으로 바꾸고, 0은 공백으로 바꿈
- 제출
이렇게하니 런타임 오류가 4개가 났다.
처음 오류 고친 것은 int의 범위를 넘어가는 수가 들어온 경우가 있지않을까해서 Long 타입으로 바꿔봤더니 2개의 런타임 오류가 해결되었다.
잦은 형변환이 문제가 있지않을까해서 함수 내에서 String으로 바꾼 후 쭉 진행했더니 런타임 오류 해결
- 알아야 할 것
큰 자료형 -> 작은 자료형 : 데이터 손실 발생 가능성이 있다.
논리형 : boolean(1)
문자형 : char(2)
정수형 : byte(1), short(2), int(4), long(8)
실수형 : float(4), double(8)
괄호 : byte, (1byte = 8bit)