띠오니 개발자 성장일지
article thumbnail
반응형

인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.

C, C++, Python, Js 등 다른 언어의 강의도 있으니 본인에게 맞는 강의를 선택하시면 됩니다. 😁

https://inf.run/pCPH

 


 

Q1-12. 암호 찾기

철수는 영희에게 알파벳 대문자로 구성된 비밀편지를 컴퓨터로 보낸다.
비밀편지는 철수와 영희가 서로 약속한 암호로 구성되어 있다.
비밀편지는 알파벳 한 문자마다 # 또는 *이 7개로 구성되어있다.

예를 들어, 철수가 "#*****#" 로 구성된 문자를 보냈다면, 영희는 아래와 같이 해석한다.

1. "#*****#" 를 7자리 이진수로 바꾼다. #은 1, *은 0으로 변환한다. 즉 "1000001"로 변환.
2. 바뀐 2진수 값을 10진수로 바꾼다. 1000001(2) = 65(10)
3. 아스키 코드 65를 문자로 변환한다. 즉 65 = 'A'

철수가
#****###**#####**#####**##**
이렇게 보냈다면
영희는 최종적으로 "COOL" 로 해석한다.

첫 줄에는 보낸 문자의 개수를 입력하고,
다음 줄에는 #나 *로 이루어진 비밀편지를 입력한다.
철수는 항상 대문자로 해석할 수 있는 편지를 보낸다.
ex)
4
#****###**#####**#####**##**

암호를 해석하여 출력하는 프로그램을 작성하시오.

 

 

✏️ 내가 쓴 답

철수는 COOL 같은 비밀 편지를 보내는데, 각 문자 C,O,O,L 등은 #이나 *가 7자리로 이루어져있다고 했다.

예를 들어 첫 줄에 4를 입력받았다면, 비밀편지는 4*7=28개의 암호문으로 이루어져 있고, 해독된 암호는 4개의 알파벳으로 이루어져 있다는 의미이다.

그러므로, 비밀편지는 7자리씩 잘라 하나씩 해독한다!

반복문을 통해 알파벳의 개수만큼 반복하며 암호를 해독하자.

위 예시 암호로 해보자면 #****###**#####**#####**##**

i=0 일 때, 0번째 인덱스부터, 7 번째 인덱스 문자까지 잘라 문자열 pw에 저장한다. (이 때 str="#**#####**#####**##**" )

i=1 일 때, 0번째 인덱스부터, 7 번째 인덱스 문자까지 잘라 문자열 pw에 저장한다. (이 때 str="#**#####**##**")

... 이런식으로 알파벳 개수까지 반복하며, replace() 함수를 통해 #은 1로, *은 0으로 변환한다.

replace로 변환한 pw는 "1000011" 이렇게 단순 문자열로 저장되어 있는데, 이를 10진수로 바꾸기 위해서는 Integer.parseInt() 를 사용한다.

Integer.parseInt(pw, 2); 이렇게 입력하면, pw문자열을 2진수로 인식해 10진수 정수로 반환해주는 것이다.

2진수가 아닌 8진수, 16진수로 인식시키고 싶다면 2대신 8, 16 등을 쓰면 된다.

정수를 다시 아스키코드 문자로 표현하는 것까지 해야하므로 (char)pwInt 캐스팅을 통해 알파벳을 도출해내고, 이를 문자열에 누적해 저장하면 비밀편지의 내용을 알 수 있게 된다!

import java.util.Scanner;

public class Main {
    public String solution(int cnt, String str){
        String answer = "";

        for(int i=0; i<cnt; i++){
            String pw = str.substring(i*7, i*7+7); // end-1 번째 문자까지 출력한다
            pw = pw.replace('#', '1');
            pw = pw.replace('*', '0');

            int pwInt = Integer.parseInt(pw, 2);    // 2진수인 String을 10진수로 나타내준다 

            answer += (char)pwInt;
        }

        return answer;
    }

    public static void main(String[] args) {
        Main main = new Main();

        Scanner sc = new Scanner(System.in);
        int cnt = sc.nextInt();
        String str = sc.next();
        System.out.println(main.solution(cnt, str));
    }
}

 

반응형

 

👨🏻‍🏫 풀이코드

substring() 으로 문자열을 자르고, #, *를 변환하는 것을 한 줄에 입력할 수 있다.

또, 쌤은 for문 마지막에서 해독이 끝난 7자리 문자를 잘라버린다.

거의 유사하다고 볼 수 있따 ^ ^ 

public String solution(int n, String s){
		String answer="";
		for(int i=0; i<n; i++){
			String tmp=s.substring(0, 7).replace('#', '1').replace('*', '0');
			int num=Integer.parseInt(tmp, 2);
			answer+=(char)num;
			s=s.substring(7);
		}
		return answer;
	}

문제는 길지만 생각보다 어렵지 않은 문제였다.

 

 

🤓 정리

  • substring()
  • replace()
  • Integer.parseInt() 를 진수 변환으로 활용할 수 있다.

이로써 1단원 String(문자열) 학습이 끝났다. 

그 다음 과정으로는 Array(1, 2차원 배열) 인데 기대가 된다.

이것저것 바쁘다 보니 예정보다 좀 미뤄지긴 했는데, 다시 시작해야겠다.

다음 단원도 화이팅! 🤓

반응형
profile

띠오니 개발자 성장일지

@띠오니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!