[백준알고리즘] 문자열 - 1157번 단어공부 문제
왜 문제 이름이 단어공부인지는 모르겠지만
아무튼 아스키코드표를 참고하며 코드를 다음과 같이 짜봤다.
얼마전에 배운 버퍼를 이용하여 입출력을 하는 방식을 썼고
입력받은 문자열의 각 문자들의 횟수를 카운트 하는것은 전에 풀었던 10809번 알파벳 찾기 문제에서와 같이
a~z까지의 26크기의 int형 배열을 만들었다.
입력받은 문자열을 우선 char 배열로 만들고 (toCharArray())
foreach문을 이용하여 배열에 있는 문자들을 하나씩 꺼내어 소문자인지 혹은 대문자인지를 판단하고,
소문자라면 - 'a' 대문자라면 - 'A' 연산을 해주어 alpCount배열에서의 인덱스를 찾고 해당 위치의 값을 1씩 증가시켰다.
동시에 alpCount 배열 내에서 가장 큰 값 또한 구해준다(max)
그리고 for문을 돌려서 alpCount의 값과 아까 구해놓은 max값과 비교하여 같다면 isDuplicate값을 증가시킨다.
이 값이 2 이상이 된다면 가장 많이 등장한 문자가 중복되어 존재한다는 뜻이므로,
출력할때 ?를 출력해주기 위함이다.
동시에 max값을 가진 값의 배열 인덱스 또한 maxCharIndex에 저장해준다.
그리고 write로 출력할때 위에서 구한 isDuplicate값을 확인하고,
2 이상이면 ?를 출력, 아니라면 해당 인덱스에서 65을 더한 연산을 한 뒤 char형으로 강제 형변환해준다.
그렇게 하면 해당 문자가 대문자로 출력되어 나오게 되는 것이다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String word = br.readLine();
char wordChar[] = word.toCharArray(); //입력받은 문자열을 char 배열로 만들어줌
int alpCount[] = new int[26]; //a~z까지의 알파벳만큼의 배열 생성, 0부터 a를 의미
int max = 0; //가장 많이 들어간 문자의 등장횟수
int isDuplicated = 0; //가장 많이 들어간 문자의 횟수가 중복되어 존재한다면(여러개라면) 이 값이 1 이상일것
int maxCharIndex = 0; //가장 많이 들어간 문자의 배열 인덱스
for (char c : wordChar) {
if (c >= 65 && c <= 90) { //c가 숫자로 65~90범위 내라면 대문자라는 뜻
alpCount[c - 'A'] += 1;
if (alpCount[c - 'A'] > max) { //만약 이게 max값보다 크면 값 갱신해준다
max = alpCount[c - 'A'];
}
//문자열의 각 문자를 꺼내와 해당 문자에 해당하는 인덱스의 값을 1씩 증가
} else if (c >= 97 && c <= 122) { //c가 숫자로 97~122범위 내라면 소문자라는 뜻
alpCount[c - 'a'] += 1;
if (alpCount[c - 'a'] > max) { //만약 이게 max값보다 크면 값 갱신해준다
max = alpCount[c - 'a'];
}
}
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //할당된 버퍼에 값 넣어주기
for (int i = 0; i < 26; i++) {
if (alpCount[i] == max) {
isDuplicated++;
maxCharIndex = i;
}
}
if (isDuplicated > 1) {
bw.write("?");
} else {
bw.write((char)(maxCharIndex + 65)); //65 더해주면 아스키코드상 대문자 수로 나옴
}
bw.flush();
bw.close();
}
}
나는 이렇게 했지만 다른사람의 코드를 보니
밑에있는 for문 안에서 max값과 비교하여 배열 내의 값이 이보다 크면 max값을 갱신, 출력할 해당 문자를 구하고
배열 내의 값이 max와 같다면 출력할 문자 변수에 ?를 넣어가며
최종적으로 할당된 문자 변수 값을 출력해주는 식으로 하기도 했다.
아래와 같다.
int max = -1;
char ch = '?';
for (int i = 0; i < 26; i++) {
if (arr[i] > max) {
max = arr[i];
ch = (char) (i + 65); // 대문자로 출력
}
else if (arr[i] == max) {
ch = '?';
}
}
System.out.print(ch);
성능면에서 큰 차이는 없겠지만 굳이 isDuplicated라는 변수를 쓰지 않아도 됐던것!