[프로그래머스] (1차) 비밀지도

fsm12·2023년 6월 6일
0

프로그래머스

목록 보기
3/57
post-thumbnail
post-custom-banner

문제링크

문제 이해

[ 입력형태 / 조건 ]

N
숫자로 구성된 문자열 | 1 ~ 16

arr1, arr2
N*N의 맵에서 같은 행의 값들을 벽이면 1, 없으면 0으로 치환했을 때 나오는 값을 2진수라 가정하고 이를 십진수로 변환한 값들의 집합

[ 문제 ]

=> arr1 배열과 arr2 배열에서 하나라도 벽("#")이면 벽으로, 모두 공백(" ")이면 공백으로 취급하여 만들어진 배열을 "#"과 " "으로 이루어지도록 출력

[ 풀이 ]

한곳이라도 벽이면 벽, 둘다 공백이면 공백으로 해독 => OR 연산



코드

> [실패] 1차 시도

  • 생각한 풀이 그대로 구현
class Solution {
    public String[] solution(int N, int[] arr1, int[] arr2) {
        String[] answer = new String[N];
        for(int n=0; n<N; n++){
            answer[n] = Integer.toBinaryString(arr1[n] | arr2[n]).replace("1","#").replace("0"," ");
        }
        return answer;
    }
}


=> 이진수로 변환했을 때 N의 자리수보다 작으면 padding값을 채워주어야 하는데 이를 고려하지 못했습니다.


> [성공] 2차 시도 - StringBuilder 사용

  • StringBuilder로 가변 String객체를 생성해서 insert함수를 통해 앞에 넣어주는 방식으로 구현
class Solution {
    public String[] solution(int N, int[] arr1, int[] arr2) {
        String[] answer = new String[N];
        for(int n=0; n<N; n++){
            String binary_str = Integer.toBinaryString(arr1[n] | arr2[n]).replace("1","#").replace("0"," ");
            
            StringBuilder sb = new StringBuilder();
            for(int i=0; i<N-binary_str.length(); i++){
                sb.insert(0," ");
            }
            sb.append(binary_str);
            
            answer[n] = sb.toString();
        }
        return answer;
    }
}



> [성공] 3차 시도 - String.format("%[padding값][몇자리로 출력할지][몇진수로 출력할지]", 값) 메소드 사용

  • 주의) 변환할 때 Long.parseLong으로 해야 런타임 에러가 발생하지 않음
class Solution {
    public String[] solution(int N, int[] arr1, int[] arr2) {
        String[] answer = new String[N];
        for(int n=0; n<N; n++){
            answer[n] = String.format("%0"+N+"d", Long.parseLong(Integer.toBinaryString(arr1[n] | arr2[n]))).replace("1","#").replace("0"," ");
        }
        return answer;
    }
}

시도 2에 비해 실행 속도가 굉장히 느림을 알 수 있었습니다.


< 참고 >

  1. 원하는 진수로 변환
// Integer.to진수String(바꿀 정수) 메소드 이용
System.out.println(Integer.toBinaryString(20)); // 2진수 : 10100
System.out.println(Integer.toOctalString(20)); // 8진수 : 24
System.out.println(Integer.toHexString(20)); // 16진수 : 14

// Integer.parseInt(숫자로 구성된 문자열, 진수) 메소드 이용
System.out.println(Integer.parseInt("100", 2)); // 4
System.out.println(Integer.parseInt("100", 10)); // 100
  1. 패딩값 추가
// StringBuilder/Buffer의 insert(추가할 인덱스 위치, 값) 메소드 이용
sb.insert(0," ");

// String.format("%[padding값][몇자리로 출력할지][몇진수로 출력할지]", 값) 메소드 이용
String.format("%02d", 3) // 03



TIP : 10진수를 원하는 진수로 바꿀 때 자주 사용되는 메소드인 "Integer.to[Binary, Octal, Hex]String(바꿀 정수)"를 기억하자

post-custom-banner

0개의 댓글