문제
해결 방안 고민
치환 암호: 평문에 들어있는 각각의 문를 주어진 치환 방법으로 암호화
평문 알파벳 대치표 : 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
복사