Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 10992
- 모든행과열대각선의합
- 격자판
- 등수구하기
- 임시반장 정하기
- Two Pointer
- 공통원소 구하기
- 10991
- 큰 수 출력하기
- 점수계산
- 인프런
- 알고리즘
- 아스키코드
- 코테준비
- 투 포인터
- 뒤집은 소수
- array
- 배열
- 보이는 학생
- 백준
- GitHub #Commit #BaekJoon
- 두 배열 합치기
- Pointer
- 누적 계산
- java
- 최대 길이
- 연속부분수열
- 가장 짧은 문자거리
- 자바
- ArrayList
Archives
- Today
- Total
ezhoon
[인프런] 01_12 암호 본문
문제
- 알파벳이 한 문자마다 '#' 또는 '*'이 일곱 개로 구성돼 있다.
- 예시로 “#*****#” 으로 구성된 문자가 입력되면 다음과 같은 규칙으로 해석한다
- “#*****#”를 일곱 자리 이진수로 바꾼다 #은 1로 *은 0으로 즉 "1000001"로 변환된다.
- 바뀐 2진수를 10진수화 한다. -> 65
- 아스키 번호 65는 대문자 'A' 이다
- 예시로 “#*****#” 으로 구성된 문자가 입력되면 다음과 같은 규칙으로 해석한다
- 첫 줄에는 보낸 문자의 개수를 입력한다.
- 두 번째 줄에는 문자의 개수의 일곱 배만큼의 # 또는 *가 입력된다.

이해
위 링크에 아스키코드 값 정리해둔 이미지가 있고 예제 문제 풀이가 있다.
- 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));
}
}
좀 더 간결하고 보기 좋은 코드가 나왔습니다.
'[Java] 인프런 문제풀이 > Stirng(문자열)' 카테고리의 다른 글
[인프런] 01-11 문자열 압축 (0) | 2022.01.21 |
---|---|
[인프런] 01-10 가장 짧은 문자거리 (0) | 2022.01.20 |
[인프런] 01-09 숫자만 추출 (0) | 2022.01.19 |
[인프런] 01-08 유효한 팰린드롬 (0) | 2022.01.19 |
[인프런] 01-07 회문문자열 (0) | 2022.01.18 |