Backend
home
🔒

[백준] 복호화

생성일
2025/02/04 01:10
태그
BaekJoon
게시일
2025/02/04
최종 편집 일시
2025/02/04 01:18

문제

해결 방안 고민

치환 암호: 평문에 들어있는 각각의 문를 주어진 치환 방법으로 암호화 평문 알파벳 대치표 : abcdefghijklmnopqrstuvwxyz 암호문 알파벳 대치표 : wghuvijxpqrstacdebfklmnoyz 가장 빈번하게 나타나는 문자를 출력 만약에 가장 빈번하게 나타나는 문자가 여러 개 인 경우 '?' 출력 캐릭터로 구분
Markdown
복사

해결 방법

테스트 횟수를 입력 받은 다음 반복문을 실행한다.
빈 공백도 입력이 가능하기 때문에 replace 메소드를 통해 공백을 제거하고 charAt() 메서드를 통해 ‘a’ 를 0으로 계산한 다음 1씩 추가해준다.
최댓값 중복시 count를 1 증가시켜준 다음 count 가 1보다 클 경우 “?” 출력하고 아니면 최다 수의 알파벳을 출력해주면 된다.

코드

import java.io.*; // 복호화 - 브론즈 2 public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); for (int i = 0; i < N; i++) { String str = br.readLine().replace(" ", ""); int max = 0; // 최다 알파벳 인덱스 번호 저장 int count = 0; // 최다 알파벳이 2개 이상 int[] alphabet = new int[26]; int alphaLength = alphabet.length; int length = str.length(); for (int j = 0; j < length; j++) { alphabet[str.charAt(j) - 'a']++; } for (int k = 1; k < alphaLength; k++) { if (alphabet[max] < alphabet[k]) { max = k; } } for (int value : alphabet) { if (alphabet[max] == value) { count++; } } char ch = (char) (max + 'a'); System.out.println(count > 1 ? "?" : ch); } } }
Java
복사

다른 코드

코드 길이가 더 길기는 하지만 시간은 위 코드보다 8ms 더 빨리 나왔다.
System.lineSeparator() 생각하기는 쉽지 않았다.
확실히 String은 StringBuilder 를 활용하여 출력하는 게 더 빠르다.
import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(br.readLine()); // 정수 입력 for (int i = 0; i < N; i++) { int[] alphabet = new int[26]; // a ~ z 까지 저장 char[] arr = br.readLine().toCharArray(); // 문자열을 char 배열로 저장 // 각 문자의 빈도수 계산 - 아스키 코드 활용하여 알파벳 배열에 추가 for (char value : arr) { if (value >= 'a' && value <= 'z') { // 소문자 알파벳 범위 확인 alphabet[value - 'a']++; // 인덱스 출력 } } // 가장 많이 나타나는 알파벳의 빈도수 찾기 int max = 0; for (int count : alphabet) { if (count > max) { // count가 max 보다 크다면 max값을 count로 업데이트 max = count; } } // 가장 많이 나타나는 알파벳의 개수 세기 int count = 0; // 알파벳의 개수 int answer = 0; // 알파벳의 인덱스 for (int j = 0; j < 26; j++) { // 알파벳 개수만큼 순회 if (alphabet[j] == max) { // 가장 자주 나타나는 알파벳 == 알파벳의 인덱스 count++; // 알파벳 개수 증가 answer = j; // 가장 많이 나타나는 빈도를 가진 알파벳의 인덱스 저장 } } // 결과 문자열을 StringBuilder 에 추가 // count가 1일 때와 그렇지 않을 경우 다른 값 선택하기 // answer 인덱스를 알파벳으로 변환 (answer: 0 = a+0 = a, answer: 1 = a+1 = b) // count가 1일 경우 sb 추가 // 그렇지 않을 경우 ? 출력 // System.lineSeparator() : 개행 sb.append(count == 1 ? (char)('a' + answer) : "?").append(System.lineSeparator()); } // 문자열로 결과 출력 System.out.print(sb.toString()); } }
Java
복사