[코테 준비 : day11]

Eunjin·2023년 4월 26일
0

1. 비밀지도

: 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.

  1. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
  2. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
  3. "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
  4. 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.

네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.

입력 형식
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.

1 ≦ n ≦ 16
arr1, arr2는 길이 n인 정수 배열로 주어진다.
정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2n - 1을 만족한다.

출력 형식
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.


[문제 풀이 고민] 각 배열의 수를 2진법으로 바꿔서 겹치는 부분은 벽/통로가 되는 것 먼저 배열의 숫자들을 2진법으로 바꿈 1지도와 2지도가 모두 공백일 경우 공백.

1)

  • Integer.toBinaryString()으로 변환한 이진수 문자열을 지도의 크기(n)에 맞게 0으로 채워진 문자열로 변환하는 역할을 하게 구현
  • 지도에서 하나라도 1일 경우 벽 (#)으로 표시
  • 둘다 0일 경우 공백으로 출력
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;
    }
}

[다른 사람 코드]

  • 관련 함수에 대한 정보를 많이 알아야한다
  • Integer.toBinaryString, replaceAll
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;
    }
}


2. 문자열 내 마음대로 정렬하기

: 문자열로 구성된 리스트 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 배열

  • Collections.sort(list);
    : 오름차순으로 정렬
  • Collections.sort(list, Collections.reverseOrder());
    : 내림차순으로 정렬
  • Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
    : 대소문자 구분없이 오름차순으로 정렬
  • Collections.sort(list, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
    : 대소문자 구분없이, 내림차순으로 정렬


3. 숫자 문자열과 영단어

: 네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

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;
    }
}

0개의 댓글

관련 채용 정보