[백준] 1157번: 단어 공부
풀이
처음 풀었던 풀이이다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = br.readLine().toLowerCase();
int[] alphaCnt = new int[26];
boolean chk = false;
int len = str.length();
for (int i = 0; i < len; ++i) {
++alphaCnt[str.charAt(i) - 97];
}
int max = alphaCnt[0];
int maxIdx = 0;
for (int i = 1; i < 26; ++i) {
if (alphaCnt[i] > max) {
max = alphaCnt[i];
maxIdx = i;
chk = false;
} else if (alphaCnt[i] == max) chk = true;
}
if (!chk) {
bw.write((char) (maxIdx + 65));
} else {
bw.write("?");
}
br.close();
bw.flush();
bw.close();
}
}
문자열을 입력받고 바로 소문자로 변환하여 String str 객체에 저장한다.
str 문자열에 있는 각각의 알파벳 개수를 int 타입 배열 alphaCnt에 저장한다.
최댓값 비교와 최댓값이 위치한 인덱스 값을 저장하기 위해 int 타입 변수 max와 maxIdx를 선언한다.
이후 for문에서 가장 많이 사용된 알파벳 인덱스 값을 구한다. 만약 최댓값 개수가 같은 알파벳이 있다면 boolean 타입 변수 chk를 true로 바꾸어준다.
chk가 true인 경우 가장 많이 사용된 알파벳이 여러 개라는 의미이므로 ?를 출력하고, 아닌 경우 가장 많이 사용된 알파벳을 대문자로 변환하여 출력한다.
근데 시간이 296ms나 걸렸다. 😦❓ 그래서 시간을 줄이는 방법을 찾기로 했다.
이 상황에서 제일 의심되는 건 toLowerCase() 메서드였다. 그래서 대소문자 변환을 메서드를 사용하지 않고 작성했다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] alphaCnt = new int[26];
boolean chk = false;
int c = System.in.read();
while (c >= 65) {
if (c >= 97) {
++alphaCnt[c - 97];
} else {
++alphaCnt[c - 65];
}
c = System.in.read();
}
int max = alphaCnt[0];
int maxIdx = 0;
for (int i = 1; i < 26; ++i) {
if (alphaCnt[i] > max) {
max = alphaCnt[i];
maxIdx = i;
chk = false;
} else if (alphaCnt[i] == max) chk = true;
}
if (!chk) {
bw.write((char) (maxIdx + 65));
} else {
bw.write("?");
}
bw.flush();
bw.close();
}
}
문자열을 한꺼번에 읽어오지 않고, System.in.read()를 사용하여 한 문자씩 읽어오게 하였다.
while문 조건은 읽어오는 문자가 65보다 큰 경우에만 실행되도록 하였다. 문자열 입력이 끝나면 개행이 들어오는데 이때 개행은 아스키코드 값으로 (윈도우 기준) 10이기 때문에 while문이 실행되지 않는다.
97보다 큰 경우 소문자이니 인덱스 값으로 c - 97을 넣어준다. 97보다 크지 않은 경우 대문자이니 인덱스 값으로 c - 65를 넣어준다.
이후 로직은 위 코드와 동일하다.
효과는 극적이었다. 160ms까지 시간이 줄었다.