: 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입력 형식
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
1 ≦ n ≦ 16
arr1, arr2는 길이 n인 정수 배열로 주어진다.
정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.
출력 형식
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
1)
class Solution {
public String[] solution(int n, int[] arr1, int[] arr2) {
String[] answer = new String[n];
String[] arrStrint1 = new String[arr1.length];
String[] arrStrint2 = new String[arr2.length];
//이진 법으로 재배열
for(int i = 0; i < arr1.length; i++){
arrStrint1[i] = String.format("%" + n + "s", Integer.toBinaryString(arr1[i])).replaceAll(" ", "0");
arrStrint2[i] = String.format("%" + n + "s", Integer.toBinaryString(arr2[i])).replaceAll(" ", "0");
}
//새로운 지도 생성
for(int i = 0; i < n; i++){
String str = "";
for(int j = 0; j < n; j++){
//두 개의 지도 중 하나라도 벽이면 벽으로 표시
if(arrStrint1[i].charAt(j) == '1' || arrStrint2[i].charAt(j) == '1'){
str += "#";
}
//두 개의 지도가 모두 공백이면 공백으로 표시
else{
str += " ";
}
}
answer[i] = str;
}
return answer;
}
}
[다른 사람 코드]
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;
}
}
: 문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
제한 조건
strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
[문제 풀이 고민]
n의 자리에 있는 알파벳으로 재정렬하는 것.
1. n의 자리에 있는 알파벳을 추출
2. 해당 알파벳을 비교해서 재정렬
1) 재출한 코드
import java.util.*;
class Solution {
public String[] solution(String[] strings, int n) {
String[] answer = new String[strings.length];
ArrayList<String> arr = new ArrayList<>();
for(int i = 0; i < strings.length; i++){
//배열에 n번째 알파벳 넣기
arr.add("" + strings[i].charAt(n) + strings[i]);
}
//재배열
Collections.sort(arr);
//앞에 붙인 알파벳 삭제
for(int i = 0; i < strings.length; i++){
answer[i] = arr.get(i).substring(1,arr.get(i).length());
}
return answer;
}
}
[기억할 이론]
https://hianna.tistory.com/569
ArrayList 배열
: 네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.
다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.
1478 → "one4seveneight"
234567 → "23four5six7"
10203 → "1zerotwozero3"
이렇게 숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
참고로 각 숫자에 대응되는 영단어는 다음 표와 같습니다.
숫자 영단어
0 zero
1 one
2 two
3 three
4 four
5 five
6 six
7 seven
8 eight
9 nine
제한사항
1 ≤ s의 길이 ≤ 50
s가 "zero" 또는 "0"으로 시작하는 경우는 주어지지 않습니다.
return 값이 1 이상 2,000,000,000 이하의 정수가 되는 올바른 입력만 s로 주어집니다.
[문제 풀이 고민]
숫자를 줄때 일부 숫자를 영단으로 바꾼 카드를 주면 숫자를 찾는 게임
하나의 배열에 숫자가 영어로 된 것을 저장 시켜야할 것 같음
그다음 해당 문자열에서 숫자 이전 이후를 자르고 배열에서 확인해서 숫자로 변환 후 출력하면 될 것 같음
class Solution {
public int solution(String s) {
int answer = 0;
String[] arr = {"zero", "one", "two", "three", "four","five"
,"six" , "seven" , "eight" ,"nine"};
for(int i = 0; i < arr.length; i++){
s = s.replace(arr[i], Integer.toString(i));
}
answer = Integer.parseInt(s);
return answer;
}
}