본문 바로가기

문제풀기/백준 문제풀이

[백준 문제 1157번] 단어 공부 문제

728x90
반응형

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

 

1157번: 단어 공부

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

www.acmicpc.net

 

문제 1157) 단어 공부 문제

 

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


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


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

 

NO 예제 입력 예제 출력
1 Mississipi ?
2 zZA Z
3 z Z
4 baaa A

 

정답 코드)

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String a = sc.next();
		
		a = a.toUpperCase();
		
		int arr[] = new int[40];
		
		int max = 0;
		int b = 0;
		
		for(int i=0; i<a.length(); i++) {
			arr[a.charAt(i)-65]++;
		}
		
		for(int i=0; i<a.length(); i++) {
			if(max < arr[a.charAt(i)-65]) {
				max = arr[a.charAt(i)-65];
				b = a.charAt(i)-65;
			}
		}
		
		for(int i=0; i<arr.length; i++) {
			if(max == arr[i] && i != b) {
				b = -1;
				break;				
			}
		}
		
		
		if(b == -1) {
			System.out.println("?");
		} else {
			System.out.println((char)(b + 65));			
		}
	}
}


1. 먼저 문자열을 입력받고 출력값이 모두 대문자이기 때문에 모든 글자를 대문자로 바꿔줍니다.
2. 배열을 지정해 A-Z까지 공간을 만들어 줍니다.(26개)
3. 최대값을 저장할 변수 max와 최대값의 위치를 저장할 변수 b를 생성합니다.
4. a의 길이만큼 for문을 반복해 해당 위치의 숫자를 1씩 증가시킵니다.
   ▷ a.charAt(i) - 65 = a.charAt(i) - 'A'와 같습니다. (A = 0 ~ Z = 25)
5. 두 번째 for문은 최대값과 그 위치를 저장할 수 있게 만듭니다.
6. 마지막 for문은 만약 중복되는 최대값이 있으면 for문을 벗어나게 만듭니다.
7. b의 값에 따라 중복되면 물음표(?), 중복되지 않으면 (char)(b + 65)를 통해 다시 대문자로 만들어줍니다.  

 

이 문제를 풀 때 for문을 여러번 사용하는 것을 피하기 위해서 여러 시도를 해보았지만 되지 않아서 for문을 3개나 써버렸네요,,ㅎㅎ

 

여기서 더 줄이고 싶으면 max 값을 없애고 b를 좀 더 활용해서 코드 길이를 줄일 수 있을 것 같아요!!

 

오랜만에 문제 리뷰했네요! 계속 풀어볼게요~

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

728x90
반응형