인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.
C, C++, Python, Js 등 다른 언어의 강의도 있으니 본인에게 맞는 강의를 선택하시면 됩니다. 😁
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차원 배열) 인데 기대가 된다.
이것저것 바쁘다 보니 예정보다 좀 미뤄지긴 했는데, 다시 시작해야겠다.
다음 단원도 화이팅! 🤓
'Study > 알고리즘' 카테고리의 다른 글
[알고리즘/인프런] Array(1, 2차원 배열) #2-02. 보이는 학생 (0) | 2022.05.08 |
---|---|
[알고리즘/인프런] Array(1, 2차원 배열) #2-01. 큰 수 출력하기 (0) | 2022.05.08 |
[알고리즘/인프런] String(문자열) #1-11. 문자열 압축 (0) | 2022.05.02 |
[알고리즘/인프런] String(문자열) #1-10. 가장 짧은 문자거리 (0) | 2022.04.27 |
[알고리즘/인프런] String(문자열) #1-09. 숫자만 추출 (0) | 2022.04.18 |