문제 풀이

[백준] 1157번: 단어 공부 - JAVA (자바)

auyeol 2023. 8. 9. 17:47
728x90

 

문제

 

 

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

 

1157번: 단어 공부

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

www.acmicpc.net

 

단어를 입력한 뒤, 가장 많이 사용된 알파벳을 대문자로 출력하는 문제이다. 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력해야하며, 대문자와 소문자를 구분하지 않는다.

 

입력                                    	출력
Mississipi					?

입력                                    	출력
baaa						A

입력                                    	출력
zZa						Z

 

 

------------------------------------------------------------------------------------------------------------------

 

 

 

풀이

 

Scanner를 이용하여 단어를 문자열로 입력받은 뒤, 알파벳의 개수만큼의 배열을 생성하였다.

 

이후, charAt()에 -65를 하여 a는 0번째 인덱스, b는 1번째 인덱스 ..... 이렇게 해당되는 알파벳 배열 위치에 +1씩 되도록 하였다.

 

max값을 구한 뒤, for문을 한번 더 실행하여 max값과 동일한 값의 인덱스가 존재하는경우 count++, count 개수가 2개 이상인 경우 '?' 를, 아닌 경우에는 알파벳을 출력하게 하였다.

 

설명이 내가 봐도 이해하기 어려울 것 같아서 아래쪽에 주석을 포함한 코드를 올려놓았다.

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		
		String str = sc.next(); 
		
		sc.close();

		int len = str.length(); 
		
		int max = 0, arr_num = 0, count = 0; 
		char alp_arr[] = new char[26]; 
		
		for(int i=0;i<len;i++) {
			int num = str.charAt(i) - 65; 
			
			if(num>=32 && num<=57)  
				num -= 32;			
					
			alp_arr[num] += 1; 
		}
		
		for(int i=0;i<alp_arr.length;i++) {
			if(alp_arr[i]>max) { 
				max = alp_arr[i]; 
				arr_num = i;
			}
		}
		
		for(int i=0;i<alp_arr.length;i++) {
			if(max == alp_arr[i]) { 
				count++;	
			}
		}
		
		if(count>=2) { 
			System.out.println('?');
		}else { 
			System.out.println((char)(arr_num+65));
		}
		
	}
}

 

 

 

 

------------------------------------------------------------------------------------------------------------------

(주석 포함)

import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		
		String str = sc.next(); // 문자열 입력받기
		
		sc.close();

		int len = str.length(); // 문자열 개수만큼 char형으로 변경하기 위해서 길이 구하기
		
		int max = 0, arr_num = 0, count = 0; // 반복된 횟수의 최댓값 max, 배열 번호 arr_num, max의 개수를 세기 위한 count 변수 선언
		char alp_arr[] = new char[26]; // 알파벳의 개수 26만큼 배열 생성 
		
		for(int i=0;i<len;i++) {
			int num = str.charAt(i) - 65; // 문자열을 char형으로 바꾼 뒤 -65 (ASCII 코드 65: A ~ 122: z)
			
			if(num>=32 && num<=57) // 소문자로 입력받은 경우에 대문자로 바꿔주기 (ASCII 코드 65:A, 97: a) 
				num -= 32;			
					
			alp_arr[num] += 1; // 해당하는 배열에 +1 ( a는 alp_arr[0], b는 alp_arr[1] ... )
		}
		
		for(int i=0;i<alp_arr.length;i++) {
			if(alp_arr[i]>max) { // max값 구하기, max값의 배열번호 arr_num에 저장 
				max = alp_arr[i]; 
				arr_num = i;
			}
		}
		
		for(int i=0;i<alp_arr.length;i++) {
			if(max == alp_arr[i]) { // for문을 한번 더 실행해서 max값과 동일한 값의 인덱스가 존재하는경우 count++ 
				count++;	
			}
		}
		
		if(count>=2) { // count가 2 이상인 경우 ? 출력
			System.out.println('?');
		}else { 
			System.out.println((char)(arr_num+65));
		}
		
	}
}

 

 

 

728x90