Algorithm/Baekjoon
[백준] 1157번 : 단어 공부 - Java
unknownomad
2022. 3. 18. 14:36
https://www.acmicpc.net/problem/1157
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
주의점
- 가장 많이 반복된 문자가 2개 이상이면 ? 출력
- 대문자, 소문자 구분 X
- 출력 문자 = 대문자
참고 자료
- 아스키코드 표
구현 방법
System.in.read()
- read(): 값을 문자 타입으로 받음
- 문자를 하나씩만 가져올 수 있음 + 아스키코드로 변환하여 가져옴
- Scanner, BufferedReader 사용하지 않고 입력값을 받을 수 있음
- Buffer (InputStream) 사용하기에 효율적임
- IOException 처리 필수
- Ex) int a = System.in.read(1);
1 이라는 숫자를 문자 타입으로 받음
'1' 이라는 문자를 ASCII 코드로 변환
ASCII 코드로 변환된 '1' 이라는 문자 = 숫자 49
풀이
1. Scanner
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] arr = new int[26]; //영문자 : 총 26개
String s = in.next();
for (int i = 0; i < s.length(); i++) {
if ('A' <= s.charAt(i) && s.charAt(i) <= 'Z') { // 대문자 범위
arr[s.charAt(i) - 'A']++; //해당 인덱스값 + 1
} else { //소문자 범위
arr[s.charAt(i) - 'a']++;
}
}
int max = -1;
char ch = '?';
for (int i = 0; i < 26; i++) {
if (arr[i] > max) {
max = arr[i];
ch = (char) (i + 65); //+ 65 : 대문자 출력
} else if (arr[i] == max) {
ch = '?';
}
}
System.out.print(ch);
}
}
2. BufferedReader
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] arr = new int[26]; //영문자 : 총 26개
String s = br.readLine();
for (int i = 0; i < s.length(); i++) {
if ('a' <= s.charAt(i) && s.charAt(i) <= 'z') {
arr[s.charAt(i) - 97]++;
} else {
arr[s.charAt(i) - 65]++;
}
}
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);
}
}
3. System.in.read()
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
int[] arr = new int[26]; //영문자 : 총 26개
/*
System.in.read()
첫 문자 입력 받기
문자 1개만 받아서 아스키코드로 변환
*/
int c = System.in.read();
while (c > 64) { //공백 입력 받는 순간 종료됨
if (c < 91) {
arr[c - 65]++;
} else {
arr[c - 97]++;
}
c = System.in.read(); //다음 문자 순차적으로 입력 받기
}
int max = -1;
int ch = -2; //? : 63
for (int i = 0; i < 26; i++) {
if (arr[i] > max) {
max = arr[i];
ch = i;
} else if (arr[i] == max) {
ch = -2;
}
}
System.out.print((char) (ch + 65));
//+ 65 : 대문자 처리
//int ➡ char로 형변환 : 아스키코드값 아닌 원래 문자 출력
}
}
성능
- System.in.read()
- BufferedReader
- Scanner