[Study] 프로그래머스 lv. 1 [1차] 비밀지도 ( 69% )

ayboori·2023년 7월 17일
0

Java Study

목록 보기
16/34

문제

https://school.programmers.co.kr/learn/courses/30/lessons/17681


배운 점

비트 연산자

지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다
지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다
: OR 연산과 동일!
1 | 1 >> 1
0 | 1 >> 1
0 | 0 >> 0

비트 연산자

StringBuilder 비우기

sb.setLength(0);가 가장 빠르다고 한다!
참고

풀이 로직

  1. 입력 받은 정사각형 크기 만큼 루프를 돈다.
  2. binary OR 연산 결과를 StringBuilder에 담는다.
  3. 결과 index를 하나씩 검사하며 1일 때 #, 0일 때 공백을 부착한다.
  4. 이진수 배열의 크기가 정사각형의 크기보다 작으면 그만큼 공백 삽입

내가 작성한 코드

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n]; // 정답을 리턴할 String 배열
        StringBuilder sb = new StringBuilder(); // String 배열 하나를 만들 StringBuilder
        int k = 0; // answer String 배열 
        
        for(int i = 0; i<n ; i++){     
            String binary = Integer.toBinaryString(arr1[i] |  arr2[i]); 
            // arr1 OR arr2 연산 결과를 String으로 만들어 담기
            sb.setLength(0); // StringBuilder 비우기
            
            for (int j = 0; j<binary.length() ; j++){ // 만들어진 binary 배열 길이만큼
            
                if(binary.charAt(j) == '1' ){ // OR 연산 결과가 1이면 # 붙이기
                    sb.append("#");
                }else{ // OR 연산 결과가 0이면 공백 붙이기
                    sb.append(" "); 
                }
                
                // 이진수 배열의 크기가 정사각형의 크기보다 작으면 그만큼 앞에 공백 삽입
                for(int l = sb.length()-1 ; l<n-binary.length() ; l++){
                    sb.insert(0, " ");
                }
            }
            answer[k++] = sb.toString(); // 만들어진 string 배열에 넣기
        }
        
        return answer;
    }
}

통과 시간

0.05ms ~ 0.22ms

테스트 1 〉	통과 (0.10ms, 74.2MB)
테스트 2 〉	통과 (0.22ms, 67.3MB)
테스트 3 〉	통과 (0.07ms, 78MB)
테스트 4 〉	통과 (0.11ms, 67.7MB)
테스트 5 〉	통과 (0.10ms, 75.6MB)
테스트 6 〉	통과 (0.16ms, 86.8MB)
테스트 7 〉	통과 (0.06ms, 71.6MB)
테스트 8 〉	통과 (0.05ms, 74.1MB)

다른 사람의 코드

replace() 사용

answer[i] = answer[i].replaceAll("1", "#");

모든 문자열을 원하는 문자 값으로 변경한다.
위의 경우 모든 1을 #으로 변경하는 데에 사용

가독성이 좋지만 시간이 오래 걸린다!

정규표현식을 사용할 수도 있다.

Repeat() : String 문자열을 파라미터의 주어진 횟수만큼 반복

if (answer[i].length() < n) {
				answer[i] = "0".repeat(n - answer[i].length()) + answer[i];
}

반복할 문자열.repeat(반복할 횟수)

format() 문자열 형식 지정

str = String.format("%" + n + "s", jinsuLEE_str) // n 자리 문자열로 전환

앞쪽 공백 채우기에 사용함

마무리

비트 연산자를 사용하니 속도가 확연히 빨랐다! 무려 다른 스터디원들의 800배.. 우하하 1초대도 나오기 힘든데 라며 눈이 세 배는 커졌다고 하셨다 야호~!!

profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글