[문제]
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
- 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
- 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
- "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
- 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[풀이]
class Solution {
static int[][] map;
public static void putMap(String bin, int index) {
String[] str=bin.split("");
int sub=map.length-str.length;
for(int i=sub, j=0;i<map[0].length;i++, j++) {
if(str[j].equals("1")) map[index][i]=1;
}
}
public String[] solution(int n, int[] arr1, int[] arr2) {
map=new int[n][n];
for(int i=0;i<arr1.length;i++) {
String bin=Integer.toBinaryString(arr1[i]);
String bin2=Integer.toBinaryString(arr2[i]);
putMap(bin, i);
putMap(bin2, i);
}
String[] result=new String[n];
for(int i=0;i<n;i++) {
String s="";
for(int j=0;j<n;j++) {
if(map[i][j]==1) s+="#";
else s+=" ";
}
result[i]=s;
}
return result;
}
}
arr1과 arr2를 받아와서 각 수를 이진수로 변환한 다음, 1은 벽(#) 0은 공백( )으로 표현하여 리턴하는 쉽지만 복잡스러운 문제..
그냥 문제에서 하라는 대로 쭉쭉 해도 문제가 크게 없을 것 같다. 시간초도 다 비슷비슷할 것 같고..
왜냐하면 어차피 이진수 변환 필요 + 지도 합치느라 반복문 필수라서?
우선 스터디 과제를 해야한다는 마음으로 급하게 풀기는 했으나, 다음에 알고리즘을 더 잘 짤 수 있다면 다시 풀어보고 싶은 문제!
푸는데는 약 10분 정도 걸린 것 같다. (제대로 시간을 안 쟀는데 어림잡아 10분 내외인듯)
참고로 약 1년 전 이 문제를 풀었었다.. 당시의 코드는 이러하다.
class Solution {
public int[] binary(int n, int num) {
int[] result=new int[n];
while(num!=1 && n-1>0) {
if(num%2==1) result[n-1]=1;
else result[n-1]=0;
num/=2;
n--;
}
result[n-1]=1;
while(n-1>0) {
n--;
result[n-1]=0;
}
return result;
}
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] map=new String[n];
for(int i=0;i<n;i++) {
int[] s1=binary(n, arr1[i]);
int[] s2=binary(n, arr2[i]);
String result="";
for(int j=0;j<n;j++) {
if(s1[j]==0 && s2[j]==0) result+=' ';
else result+='#';
}
map[i]=result;
}
return map;
}
}
왜 작년이 더 잘 푼 것 같지..? 흠.. 😟
⬇️ 오늘 제출한 코드 채점 내용

⬇️ 작년에 제출한 코드 채점 내용

평균적으로 작년의 코드가 좀 더 효율은 좋은 것 같다. 큰 차이는 없어보이지만?
애초에 이 문제 자체가 효율성에서 (엄청 이상한 코드를 작성한 게 아니라면..) 문제가 될 일이 흔치 않아 보이긴 한다.
그냥 구현이 가능하느냐?에만 초점을 두어도 될만한 문제라고 생각!
일단 작년과 오늘의 비교는 작년에는 직접 이진법을 구현했고 오늘은 Integer.toBinaryString 메소드를 이용했다는 점!
오늘도 원래 직접 이진법 구현을 하려고 했는데, 현재 시간 상 (새벽 4시반 ㅜ) 너무 졸린 관계로 .. 간단한 방법을 이용했다.. ㅎㅅㅎ
다음에 꼭 다시 풀어보자! 뇌를 잘 굴리면 더 나은 알고리즘을 짤 수 있을 것 같다는 생각이 든다.
-끝!!-
'👩🏻💻 코테' 카테고리의 다른 글
| 프로그래머스 Lv.2 : 가장 큰 수 🅾️ (0) | 2024.03.22 |
|---|---|
| 프로그래머스 Lv.2 : 게임 맵 최단거리 🅾️ (0) | 2024.03.22 |
| 프로그래머스 Lv.1 : 로또의 최고 순위와 최저 순위 🅾️ (0) | 2024.03.20 |
| 프로그래머스 Lv.1 : 이웃한 칸 🅾️ (0) | 2024.03.20 |
| 프로그래머스 Lv.2 : 숫자의 표현 🅾️ (0) | 2024.03.18 |