바위 뚫는중

[BOJ] 백준 1157. 단어 공부 본문

Algorithms/백준

[BOJ] 백준 1157. 단어 공부

devran 2023. 8. 27. 15:23
반응형

내가 제일 어려워하는 문자열 문제^^.. 난 이게 왜이리 어려울까

비슷한 문제를 최대한 많이 풀어봐야겠다.

https://www.acmicpc.net/problem/1157

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

풀이

알파벳의 개수는 26개!

대문자의 범위는 십진수로 65~90, 소문자는 97~122

해당 알파벳의 인덱스 값을 가져오기 위해서 -65를 해주면 됨

  • A는 65니까 65를 빼면 0 , B는 66 이라 1, C는 67이라 2 이렇게!

그니까 0에는 A의 갯수 저장, 1에는 B의 갯수를 저장,, 이런식으로 가장 많이 사용된 알파벳을 구한다

import java.util.Scanner;
public class Main {
	static String S;
	public static void main(String[] args) {
		 Scanner sc = new Scanner(System.in);
	   String str = sc.next().toUpperCase(); // 미리 대문자로 받는다 
		 int[] arr = new int [26]; // 알파벳은 총 26개	
		 int max = 0; // 최대 반복 횟수
		 char result = 0; // 결과
	  // 사용된 알파벳의 배열에 1씩 증가시킨다.
		 for (int i = 0; i < str.length(); i++) {
				arr[str.charAt(i) - 65]++; // 받아온문자열의 각 글자에서 65를 뺀다
				if (max < arr[str.charAt(i) - 65]) { // max는 0 으로 두고 0보다 큰값이 있다면 
					max = arr[str.charAt(i) - 65]; // max를 최댓값으로 두고 이를 계속 반복함!
					result = str.charAt(i); //결과를 해당 문자로 둔다 
					// 만약 최대값이 중복된다면 물음표 출력한다
				} else if (max == arr[str.charAt(i) - 65]) {
					result = '?';
				}
			}
	       System.out.println(result);
		}
}
반응형