문제 설명
암호화된 비밀 지도를 해독하기 위해 지도 1과 지도 2를 합쳐야 한다.
입력 형식
입력으로 지도의 한 변 크기 n과 2개의 정수 배열 arr1, arr2가 들어온다.
- 1 ≦ n ≦ 16
- arr1, arr2는 길이 n인 정수 배열로 주어진다.
- 정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.
매개변수 | 값 |
n | 6 |
arr1 | [46, 33, 33 ,22, 31, 50] |
arr2 | [27 ,56, 19, 14, 14, 10] |
출력 | ["######", "### #", "## ##", " #### ", " #####", "### # "] |
내가 생각한 해별 방법
1. arr1과 arr2의 값을 이진수로 바꾼다.
2. 이진수를 비트 연산(OR)하여 새로운 문자열로 바꾼다.
3. 바꾼 문자열에서 1은 #으로 0은 공백으로 바꾸어 배열에 넣는다.
★여기서 중요한 것은 바로 N의 값이다.
N은 한 변의 길이를 나타내는데 비트 연산 후에 앞의 자리가 0으로 채워질 수 있다. ex) 000111
그렇기 때문에 n의 길이만큼 앞에 0을 채워 넣어야 한다.!!!!!!!!!!!!!!!!!!!!!!!
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[arr1.length];
for(int i=0; i<arr1.length;i++) {
answer[i] = Integer.toBinaryString(arr1[i]|arr2[i]); //비트연산 후 이진수변환
if(answer[i].length()<n) { // 길이가 n보다 작다는 것은 앞의 자리가 0이라는 것
int zero = n-answer[i].length();
for(int j=0; j<zero; j++) { //차이나는 만큼 0으로 채웠다.
answer[i] = "0"+answer[i];
}
}
}
for(int i=0; i<answer.length;i++) {
String tmp = "";
for(int j=0; j<answer[i].length();j++) {
if(answer[i].charAt(j) == '1') {//1이면 # 0이면 공백으로
tmp+="#";
}else {
tmp+=" ";
}
}
answer[i] = tmp;
}
return answer;
}
이중 포문을 사용하여 시간 복잡도가 높게 나올 것이라 생각하였다. 하지만 최대 3.31ms로 생각보다 높은 효율성을 보였다.
통과 후에 가장 "좋아요"를 많이 받은 사람의 풀이법을 보았는데 나의 코드수보다 1/2 적었다.
그리고 그 사람의 코드를 돌려보았는데,
최대 약 4.x배 정도의 시간 차이가 났다. 내 추측으론 format 함수를 불러오는 과정에서 많은 시간이 소요될 것이라 생각하였다. 누가 봐도 이 분이 작성한 코드가 훨씬 간결하였으나 시간은 3~4배가량 차이가 난다.
이때는 어떤 코드를 선호하는 것이 좋을까?
개발자 성향에 따라 다른가????????????
'Study > Algorithm' 카테고리의 다른 글
프로그래머스 / 캐시 (JAVA) (0) | 2020.11.04 |
---|---|
프로그래머스 / 뉴스 클러스터링(JAVA) (0) | 2020.11.03 |
프로그래머스 / 짝지어 제거하기(Java) (0) | 2020.10.13 |
프로그래머스 / 영어 끝말 잇기(Java) (0) | 2020.10.08 |
프로그래머스 / 폰켓몬 (Java) (0) | 2020.10.08 |