문제
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
<작성 답안>
설계도를 글로 짜봤는데 답이 안나옴...
소문자 96~122 97~122
대문자 65 ~121 90
알파벳을 받는 문자열 함수
가장 많은 알파벳은 어떻게 비교할 것인가? 비교하는 함수
1. 문자들을 숫자로 바꾼 후, 26 + 26 숫자의 조건문을 쓰고 조건이 맞을 때마다 증가 시키는 경우.
2. 5가지 정도 머리에서 시도해봤는데 막힘.ㅠ
가장 많은 문자를 대문자로 출력하는 함수. + 알파벳이 많은 것들 중 갯수가 같을 경우 ?를 출력하는 함수
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String a = s.nextLine();
String [] arr = new String[s.nextLine()];
for(int i =0; i < a.length(); i++) {
arr[i] = s.charAt(a);
}
??????????????????????
}
}
<답안>
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);
}
}
<수정보완>
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
(int[] arr = new int[26];)추가 -> 숫자만 바뀌는 배열이라 int형으로 선언해서 컨트롤 해주면됨.
String a = s.nextLine(); // 알파벳을 받는 문자열 배열 아래의 선언은 필요없다.String [] arr = new String[s.nextLine()];
for(int i =0; i < a.length(); i++) { arr[i] = s.charAt(a);
//26자리 배열에, 알파벳을 입력받는 배열을 따로두고 넣으려 한것이겠지.(하지만 26개가 들어가는 배열은 필자가 선언하지 못했다.)
}
-> nextInt() 와 next(), nextLine()의 차이점은?
스캐너에서 '200\n'이라는 값을 입력 받았다고 하자.
nextInt()는 200이라는 값만 가지고 가게 되고 <엔터> 문자는 남게 된다.
다음번에 nextLine()이 아닌 메서드가 실행되는 경우 엔터 코드는 무시하고 다음 문자를 찾게 되니깐 상관이 없지만,
이상태에서 nextLine()메서드를 실행하게 된다면 문제가 약간 생긴다.
nextLine()을 실행하려는 이유는 한줄의 입력내용을 받기 위함 이다.
여기서 한줄이라고 함은 처음부터 개행문자(엔터)까지의 문자열을 의미합니다.
한마디로 nextLine()은 분리자도 다 읽어올 수 있고, next(), nextInt()는 분리자는 제외하고 읽어온다.
(출처: https://devlog-wjdrbs96.tistory.com/80)
->배열 두개를 비교해서 집어넣으려 하니 애초에 답이 안나왔다. 문자열 배열 1개를 통해 값을 변화시키게끔 한 뒤, 그 변화되었다는 표시를 26자리 배열에 집어넣게끔 하면 되는 것이었다.
->문자열 배열과 또 다른 배열을 연결시키는 작업을 이렇게 할 줄이야... (arr[0]은 arr[ 65 - 'A'])
if ('A' <= s.charAt(i) && s.charAt(i) <= 'Z') { // 대문자 범위
arr[s.charAt(i) - 'A']++; // 해당 인덱스의 값 1 증가
}
else { // 소문자 범위
arr[s.charAt(i) - 'a']++;
}
-> 문자열과 비교하는 26개짜리 배열을 안건들고 max변수 하나만으로 이렇게 가볍게 툭 비교만 해낼 수 있구나...(앞에서 사전작업으로 이 26개짜리 배열에 ++;를 해놓았기 때문이다.)
정답 및 풀이 출처:https://st-lab.tistory.com/64
'📟java > 백준' 카테고리의 다른 글
백준 2941 자바 (0) | 2022.11.12 |
---|---|
백준 2908 자바 (0) | 2022.11.12 |
백준 10809 자바 (0) | 2022.11.10 |
백준 11654 자바 (0) | 2022.11.10 |
백준 1065 자바 (0) | 2022.11.10 |