이 문제는 첫 번째 단어를 입력 받아 그 단어 중에서 가장 많이 사용 된 알파벳이 어떤 것인지 대문자로
출력하는 프로그램이다.
주의할 점은
1. 가장 많이 사용된 알파벳이 여러개 존재하는 경우에는 '?' 를 출력한다.
2. 입력은 대소문자로 구성된 단어가 입력된다.
3. 출력은 대문자로 출력한다.
---------------------------------------제가 푼 전체 코드---------------------------------------
import java.util.Scanner;
class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String s = sc.next().toUpperCase();
String tmp = "";
for(char i='A'; i<='Z'; i++){
int a = s.indexOf(i);
if(a!=-1){
tmp+=s.charAt(a);
}
}
int max=0;
char result = ' ';
for(int i=0; i<tmp.length(); i++){
int cnt=0;
for(int j=0; j<s.length(); j++){
if(tmp.charAt(i)==s.charAt(j)){
cnt++;
}
}
if(max < cnt){
max = cnt;
result = tmp.charAt(i);
}else if(max == cnt){
result = '?';
}
}
System.out.println(result);
}
}
로직을 설명 드리자면
1. 입력을 받으면서 모두 대문자로 만들어 줍니다.
2. 그 문자를 indexOf()를 사용하여 중복된 값을 없앤 문자열을 만듭니다.
3. 중복이 제거된 문자열과 제거되지 않은 문자열끼리 비교합니다.
4. 서로 같다면 카운트를 하여 비교할 숫자를 올려줍니다.
5. max값과 비교하여 카운트가 높으면 결과값을 현재 문자로 바꿔줍니다.
6. 최대값과 카운트 값이 같으면 ?를 출력해줍니다.
상세 설명으로 넘어가겠습니다.
입력은 Scanner를 사용했습니다.
Scanner로 입력된 문자열을 toUpperCase()로 모두 대문자로 만들어서 입력받아 줍니다.
tmp 라는 변수는 중복이 제거된 문자열을 담기 위한 변수입니다.
모두 대문자로 만들어줬기 때문에 'A'부터 'Z'까지 반복합니다.
indexOf()를 통하여 문자열 s 에 사용된 'A'부터 'Z'까지의 어떤 문자가 사용되었는지 찾아냅니다.
indexOf()는 사용되지 않은 문자는 -1을 반환하기 때문에 a가 -1이 아니라면 조건을 걸어서
tmp에 a에 입력된 인덱스에 해당하는 문자를 넣어 새로운 문자열을 만들어줍니다.
예로 들어드리면 ABCCB 라는 문자열이 있습니다.
그러면 A부터 Z까지 반복하면서 찾습니다.
처음에 A를 찾았으니 0을 반환하고 tmp에 A를 담습니다.
그리고 B를 찾습니다. 또 바로 B가 있으니 B의 인덱스인 1을 반환하여 tmp에 담습니다.
그리고 C를 찾습니다. C의 인덱스인 2를 반환하여 tmp에 담습니다.
그 뒤로 D E F 차례대로 갑니다. 하지만 ABCCB이기 때문에 그 뒤로는 모두 -1를 반환합니다.
indexOf()는 제일 먼저 나오는 문자를 찾기 때문에 중복된 문자열은 신경쓰지 않아도 됩니다.
max와 result를 초기화 해줍니다.
result는 결과값이 들어갈 변수고 max는 많이 들어간 알파벳 값을 계산하기 위한 변수입니다.
이중 반복문을 만듭니다. 큰 틀에는 중복을 제거하여 새로운 문자열을 만든 문자열을 가져오기 위함입니다.
작은 틀에는 기존 문자열을 가져오기 위함입니다.
큰 반복문이 돌때마다 cnt를 0으로 초기화 해줍니다.
예로들면 ABC라는 중복을 제거한 문자열이 있고, 기존 문자열인 ABCCB가 있습니다.
그러면 먼저 중복제거한 문자열 A와 기존 문자열 ABCCB와 비교하여 같은 문자면 cnt를 하나 더해줍니다.
max와 cnt를 비교하여 cnt가 크면 cnt를 max로 만들어주며 result를 현재 문자인 A를 넣어줍니다.
max 값과 cnt 값이 같은 경우는 많이 사용된 알파벳이 같다는 뜻이겠죠. 그래서 ? 를 출력해줍니다.
를 출력해주면 됩니다.
이 알고리즘 풀이는 필자의 주관적인 생각으로 풀이한 코드이며, 알고리즘 풀이에는 정답이 없습니다.
이런 방법도 있구나 하고 봐주시면 감사하겠습니다.
'알고리즘 with JAVA' 카테고리의 다른 글
백준 2908번 상수 - 자바 (0) | 2021.04.12 |
---|---|
백준 1152번 단어의 개수 - 자바 (0) | 2021.04.11 |
백준 2675번 문자열 반복 - 자바 (0) | 2021.04.08 |
백준 10809번 알파벳 찾기 - 자바 (0) | 2021.04.07 |
백준 11720번 숫자의합 - 자바 (0) | 2021.04.05 |