알고리즘/백준(BAEKJOON)

[1157 자바] 단어공부: 알고리즘/ 백준

jojelly 2021. 9. 23. 10:05
반응형

해당 문제는 문자의 코드값을 다루는 문제이다 아스키코드를 알고 있다면 문제는 쉬워질 것이다.

아스키코드의 대문자 A는 65 소문자 a는 97부터 시작한다.

 

[풀이방법]

1. Scanner를 이용하여 단어를 word 변수에 받는다.

2. 알파벳의 길이는 26개 배열 arr[26]을 생성해준다.

3. for문을 통해 단어의 각 알파벳을 비교해준다. 단어의 길이만큼 반복한다(word.length).

4. 문제의 핵심은 대문자 소문자 구별 없이 가장 많이 있는 알파벳을 구해야 한다.

  • for문안에 if문을 통해 대문자와 소문자를 구별해서 계산해준다.
  • if문 조건식에 단어의 각 알파벳이 65~90 사이일 경우 (대문자) , 그 이외에는 else (소문자)로 구별하여 if문을 나눠준다.
  • 대문자일 경우 해당 알파벳의 -65를 한 후 그 숫자의 배열을 ++ 해준다.
  • 소문자일 경우 해당 알파벳의 -97을 한 후 그 숫자의 배열을 ++ 해준다.
    for (int i = 0; i<word.length(); i++){                  //대문자
        if (word.charAt(i)>= 65 && word.charAt(i) <= 90){
            arr[word.charAt(i) - 65]++;
        } else {    //소문자
            arr[word.charAt(i) - 97] ++;
        }
    }

5. 이제 가장많이 사용된 단어를 대문자로 나타내줘야한다. + 가장 많은 숫자가 하나가 아닐경우 ?를 출력해야한다.

  • char no의 기본값을 ?로 설정 int max값을 -1로 설정해준다. (기본배열값이 0으로 되어있기 때문에 아무것도 없을때 ?가 나오지 않게 하기위해 max를 -1로 설정했다.)
  • char no = '?'; int max = -1;
  • for문을 통해 알파벳의 길이만큼 반복하면서 값을 비교할 것이다.
  • for문안에 if문 조건식을 각 arr의 [i] 값이 max값보다 클 경우 max값을 해당 arr [i] 값으로 저장, no값은 i값에 +65를 해서 대문자 알파벳 값으로 지정한다. (char 형 타입의 변수에 int와 char을 연산하여 저장할 경우 반드시 캐스팅해준다.)
for (int i = 0; i<26; i++){
        if (arr[i]>max) {
         max = arr[i];
         no = (char) (i+65); //대문자로 나타내기 위해 해당 알파벳 위치로
                             //char 형 타입의 변수에 int 와 char 을 연산하여 저장할 경우 반드시 캐스팅해주기(char)
        }
  • 이후 else if문으로 max값의 크기가 같을경우 ? no값을 ? 로 설정한 후 for문을 나가 no를 출력한다.
else if (arr[i]==max){
            no  = '?';
        }

전체코드

import java.util.Scanner;

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

    int[] arr = new int[26];                                //알바벳 길이 26 개


    for (int i = 0; i<word.length(); i++){                  //대문자
        if (word.charAt(i)>= 65 && word.charAt(i) <= 90){
            arr[word.charAt(i) - 65]++;
        } else {    //소문자
            arr[word.charAt(i) - 97] ++;
        }
    }

    char no = '?';
    int max = -1;       //기본배열값이 0으로 되어있기 때문에 아무것도 없을때 ?가 나오지 않게 하기위해 -1로 설정
    for (int i = 0; i<26; i++){
        if (arr[i]>max) {
         max = arr[i];
         no = (char) (i+65); //대문자로 나타내기 위해 해당 알파벳 위치로
                             //char 형 타입의 변수에 int 와 char 을 연산하여 저장할 경우 반드시 캐스팅해주기(char)
        } else if (arr[i]==max){
            no  = '?';
        }
    }
    System.out.println(no);
    }

}
반응형