공부하는 스누피

[JAVA] 비밀지도 - StringBuffer 본문

Algorithms/코딩테스트 문제풀이

[JAVA] 비밀지도 - StringBuffer

커피맛스누피 2020. 7. 21. 02:08

보물찾기!

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

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

생각과정

- 각 지도 배열에서 같은 인덱스의 정수를 이진수 문자열로 변환한다.

- 둘 중 하나라도 1이 있다면 #를 추가한다. (OR 연산으로 풀 수 있음)

 

구현

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        String format = "%"+ Integer.toString(n) +"s";
        
        for(int i=0;i<n;i++){
            //이진수 변환
            String map1 = String.format(format,Integer.toBinaryString(arr1[i]));
            String map2 = String.format(format,Integer.toBinaryString(arr2[i]));
            StringBuffer str = new StringBuffer();

            for(int j=0;j<n;j++){
            //둘 중 하나라도 벽이 있으면 벽 표기
                if(map1.charAt(j) == '1' || map2.charAt(j) == '1'){
                    str.append('#');
                }else{
                    str.append(' ');
                }
            }
            answer[i] = str.toString();
        }
        return answer;
    }
}

결과

쉬운 문제였다:)

다른 풀이 방법

1. Integer.toBinaryString() 호출할때 넘겨주는 정수값을 지도1과 지도2의 값을 비트 연산한 것으로 한다.

String map = String.format(format, Integer.toBinaryString(arr1[i] | arr2[i]));

2. Format을 "%0" + n + "d"로 하고, toBinaryString을 정수로 바꿔줘서 format 메소드에 넘겨준다.

=> %05d는 입력값이 9일때 01001로 print

=> Test case 2, 6을 통과하지 못했다. 

 

Integer.toBinaryString(int)

정수를 binary 문자열로 만들어 준다.

 

String.format(format, String)

문자열을 형식에 맞게 변환해준다. Format은 printf 메소드에서 사용하는 것과 동일하다.

 

StringBuffer

- 추가

buffer.append(String or Character) //버퍼 맨 끝에 추가

buffer.insert(index, String) //인덱스에 추가

- String으로 변환

buffer.toString()

- 다른 메소드 substirng 등은 String 클래스와 동일함

Comments