[프로그래머스/Lv. 1] [1차] 비밀지도
🔺 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
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