Algorithm/Baekjoon

[백준] 1157번 : 단어 공부 - Java

unknownomad 2022. 3. 18. 14:36

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

 

1157번: 단어 공부

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

www.acmicpc.net



주의점

  • 가장 많이 반복된 문자가 2개 이상이면 ? 출력
  • 대문자, 소문자 구분 X
  • 출력 문자 = 대문자

참고 자료

  • 아스키코드 표


구현 방법

System.in.read()

  • read(): 값을 문자 타입으로 받음
  • 문자를 하나씩만 가져올 수 있음 + 아스키코드로 변환하여 가져옴
  • Scanner, BufferedReader 사용하지 않고 입력값을 받을 수 있음
  • Buffer (InputStream) 사용하기에 효율적임
  • IOException 처리 필수
  • Ex) int a = System.in.read(1);
    1 이라는 숫자를 문자 타입으로 받음

    '1' 이라는 문자를 ASCII 코드로 변환
    ASCII 코드로 변환된 '1' 이라는 문자 = 숫자 49

풀이

1. Scanner

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);
    }
}

 

2. BufferedReader

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
    public static void main(String[] args) throws IOException {
    
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
        int[] arr = new int[26]; //영문자 : 총 26개
        String s = br.readLine();
        for (int i = 0; i < s.length(); i++) {
            if ('a' <= s.charAt(i) && s.charAt(i) <= 'z') {
                arr[s.charAt(i) - 97]++;
            } else {
                arr[s.charAt(i) - 65]++;
            }
        }
        
        int max = -1;
        char ch = '?';
        for (int i = 0; i < 26; i++) {
            if (arr[i] > max) {
                max = arr[i];
                ch = (char) (i + 65);
            } else if (arr[i] == max) {
                ch = '?';
            }
        }
        System.out.print(ch);
    }
}

 

3. System.in.read()

import java.io.IOException;
 
public class Main {
    public static void main(String[] args) throws IOException {
 
        int[] arr = new int[26]; //영문자 : 총 26개
 
        /*
        System.in.read()
        첫 문자 입력 받기
        문자 1개만 받아서 아스키코드로 변환
        */
        int c = System.in.read();
        while (c > 64) { //공백 입력 받는 순간 종료됨
            if (c < 91) {
                arr[c - 65]++;
            } else {
                arr[c - 97]++;
            }
            c = System.in.read(); //다음 문자 순차적으로 입력 받기
        }
 
        int max = -1;
        int ch = -2; //? : 63
        for (int i = 0; i < 26; i++) {
            if (arr[i] > max) {
                max = arr[i];
                ch = i;
            } else if (arr[i] == max) {
                ch = -2;
            }
        }
        System.out.print((char) (ch + 65));
        //+ 65 : 대문자 처리
        //int ➡ char로 형변환 : 아스키코드값 아닌 원래 문자 출력
    }
}

성능

  1. System.in.read()
  2. BufferedReader
  3. Scanner

 


출처 : https://st-lab.tistory.com/64