ezhoon

[인프런] 01_12 암호 본문

[Java] 인프런 문제풀이/Stirng(문자열)

[인프런] 01_12 암호

ezhoon 2022. 1. 21. 00:52

문제


  1. 알파벳이 한 문자마다 '#' 또는 '*'이 일곱 개로 구성돼 있다.
    • 예시로 “#*****#” 으로 구성된 문자가 입력되면 다음과 같은 규칙으로 해석한다
      • “#*****#”를 일곱 자리 이진수로 바꾼다 #은 1로 *은 0으로 즉 "1000001"로 변환된다.
      • 바뀐 2진수를 10진수화 한다. -> 65
      • 아스키 번호 65는 대문자 'A' 이다
  2. 첫 줄에는 보낸 문자의 개수를 입력한다.
  3. 두 번째 줄에는 문자의 개수의 일곱 배만큼의 # 또는 *가 입력된다.

출력 예시

이해


아스키코드 알파벳 문제 풀이

위 링크에 아스키코드 값 정리해둔 이미지가 있고 예제 문제 풀이가 있다.

 

  • 2진수로 변환할 때는 오른쪽에서부터 1 2 4 8 16으로 변환되므로 for문을 오른쪽에서 왼쪽으로 해야 한다.
    • 다른 방법으로는 Integer.parseInt(String, 2) 이런 식으로 하면 String 값이 2진수로 변환된다.
  • 7자리마다 잘라서 변환해야 하므로 substring()을 사용한다.
  • 대문자 아스키코드를 사용해야 한다.

 

⚠️ 주의사항


  • 대문자로 반환해야 한다는 것 말고는 딱히 없어 보입니다.

 

 

풀이


이번에는 2가지 풀이가 있습니다.

 

1. 제가 직접 풀어본 풀이입니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Java_01_12 {

    public String solution(int N, String str) {

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < N; i++) {
            StringBuilder binary = new StringBuilder();

            String tmp = str.substring(i * 7, (i + 1) * 7); // 7개씩 끊어서 저장

            for (int j = 0; j < tmp.length(); j++) {
                if (String.valueOf(tmp.charAt(j)).equals("#")) binary.append(1);
                else binary.append(0);
            }

            int answer = Integer.parseInt(String.valueOf(binary), 2); // 2진수 변환 */

            sb.append((char)answer); // 아스키코드 값 문자 변환
        }

        return sb.toString();
    }

    public static void main(String[] args) throws IOException {

        Java_01_12 T = new Java_01_12();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        String str = br.readLine();

        System.out.println(T.solution(N,str));
    }
}

중간에 if문을 사용해서 #인지 확인하고 맞으면 "1" 아니면 "0"을 append 해주었습니다. 

 

하지만 수업을 듣던 도중 더 좋은 코드가 있어서 위 코드와 합쳐서 더 괜찮아 보이는 코드로 만들었습니다.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Java_01_12 {

    public String solution(int N, String str) {

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < N; i++) {

            // 7 개씩 저장 후
            // replace("입력값","변환값") 이용해서 이진수 값으로 변환
            String tmp = str.substring(i * 7, (i + 1) * 7).replace("#", "1").replace("*", "0");
            int answer = Integer.parseInt(tmp, 2);

            sb.append((char)answer); // 아스키코드 값 문자 변환
        }

        return sb.toString();
    }

    public static void main(String[] args) throws IOException {

        Java_01_12 T = new Java_01_12();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        String str = br.readLine();

        System.out.println(T.solution(N,str));
    }
}

좀 더 간결하고 보기 좋은 코드가 나왔습니다.

Comments