코테/프로그래머스

[프로그래머스/Lv. 1] [1차] 비밀지도

imname1am 2023. 3. 24. 23:30
반응형

🔺 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

🔺 코드

- 틀린 코드

import java.util.*;

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        
        // 10진수 -> 2진수
        String[] decimalToBin1 = new String[n];
        String[] decimalToBin2 = new String[n];
        
        
        // 일단 배열을 다 이진수로 바꾸고
        // arr1 vs arr2의 String의 chartAt해서 비교해
        // 비교해서 이진수로 만들어놓고, 얘를 replace해
        for(int i=0 ; i < n ; i++) {
            decimalToBin1[i] = Integer.toBinaryString(arr1[i]);
            decimalToBin2[i] = Integer.toBinaryString(arr2[i]);
        }
        
        // 이 변환한 string이 n 크기만큼이 아니면 그 앞에 0 붙여주기
        for(int i=0 ; i < n ; i++) {
            StringBuilder str = new StringBuilder(binary);
            int len = decimalToBin1[i].length();
            
            if(len < n) {
                for(int j=0 ; j < (n-len) ; j++) {
                    str.insert(0, "0");
                    decimalToBin1[i] = str.toString();
                }
            }
        }
        
        for(String s : decimalToBin1) {
            System.out.println("decimalToBin1[i]-> " + s);
        }
        
        return answer;
    }
}
구현해보다가 시간이 길어져서 포기했지만...생각했던 방법은 이렇다.
1) 배열 arr1과 배열arr2의 int형인 십진수를 이진수로 바꾸고 String형 배열에 저장해두기.
2) 이진수로 변환한 값의 길이 < n 이면 앞에 그만큼 반복문 돌려서 '0' 붙여주기
3) charAt을 써서 decimalToBin1, decimalToBin2 둘 다 1이면 1, 둘 다 0 이면 0, 그게 아니면 1로 반환하게 해서 answer 배열에 저장 ( =  OR)
4) 저장된 answer의 값은 1과 0으로 이뤄졌으니까, 이걸 '#'이랑 ' ' 로 replace하기

 

 

 

 

- 정답 코드

import java.util.*;

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        
        for(int i=0 ; i < n ; i++) {
            answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
            
            answer[i] = answer[i].replace('0', ' ');
            answer[i] = answer[i].replace('1', '#');
            
            while(answer[i].length() < n) {
                answer[i] = ' ' + answer[i];
            }  
        }
        
        return answer;
    }
}
✅ 해결 아이디어
Integer.toBinaryString : 십진수를 이진수로 변경 (String형으로 반환)
- answer[i]에 저장하는 값 → OR 비트연산

생각보다 간단해서 놀람... 내가 너무 어렵게 생각하는 거 같기도 하구ㅠ

나는 애초에 그냥 answer[i] 길이가 n보다 작으면 앞에 그만큼 0을 저장하고 이걸 ' ' 로 replace할 생각을 했는데

그럴 필요 없이 앞에 ' ' + 해주면 되었던 것이다...


🔺 다른 풀이들

- 풀이1)

class Solution {
  public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] result = new String[n];
        for (int i = 0; i < n; i++) {
            result[i] = Integer.toBinaryString(arr1[i] | arr2[i]);
        }

        for (int i = 0; i < n; i++) {
            result[i] = String.format("%" + n + "s", result[i]);
            result[i] = result[i].replaceAll("1", "#");
            result[i] = result[i].replaceAll("0", " ");
        }

        return result;
    }
}

자릿수 맞출 때, 0을 ' '로 바꾸는 반복문을 돌려주는 대신, String.format()을 사용해서 앞을 공백으로 채워준 풀이... (9번째 줄)

String.format("%Ns", str); : str.length()가 N보다 작을 경우 앞에 공백 추가

 

 

 

- 풀이2) 

class Solution {
  public String[] solution(int n, int[] arr1, int[] arr2) {
      String[] answer = new String[n];
      String temp;

      for(int i = 0 ; i < n ; i++){
          temp = String.format("%16s", Integer.toBinaryString(arr1[i] | arr2[i]));
          temp = temp.substring(temp.length() - n);
          temp = temp.replaceAll("1", "#");
          temp = temp.replaceAll("0", " ");
          answer[i] = temp;
      }

      return answer;
  }
}

위에서 사용한 "%" + n + "s"을 하지 않고,  "%16s" 해놓고 substring해서 잘라쓴 풀이 (이게 속도가 더 빠르다함)


(참고)

✔ 0 채우기 - 문자열 앞에 prefix 붙이기 (StringBuilder / StringBuffer 이용)

 

[Java] String 앞에 문자열 붙이기 (String, StringBuffer, StringBuilder)

String, StringBuffer, StringBuilder를 사용하여 기존 문자열 앞에 다른 문자열을 붙이는 방법을 소개합니다. String StringBuffer StringBuilder 1. String 코드 public class StringConcat { public static void main(String[] args) { //

hianna.tistory.com

 

String.format() : 문자열 형식 지정 (자릿수 채우기)

 

Java - 숫자 왼쪽에 0으로 채우기

특정 자리수 만큼 정수 왼쪽에 0으로 채우는 방법을 소개합니다. 예를 들어, 아래와 같이 숫자를 10자리의 숫자로 표현하는데, 숫자 왼쪽에 부족한 공간은 0으로 채우는 방법입니다. String.format(for

codechacha.com

 

[Java] String.format 을 이용한 문자열 형식 설정하기

public static String format(String format, Object... args); public static String format(Locale l, String format, Object... args); String 의 static 메서드인 format 메서드는 문자열의 형식을 설정하는 메서드입니다. %d (10진수 형식

blog.jiniworld.me

 

 

- 풀이

 

[프로그래머스] [1차] 비밀지도 - JAVA

프로그래머스 [1차] 비밀지도 - JAVA 문제 설명 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서

dlee0129.tistory.com

 

반응형