will come true

[BOJ] 백준 10808번 - 알파벳 개수 (Java) 본문

Algorithm

[BOJ] 백준 10808번 - 알파벳 개수 (Java)

haehyun 2021. 11. 15. 00:14
728x90

문제

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

 

10808번: 알파벳 개수

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

www.acmicpc.net

  • 입력 : 길이가 100이하인 소문자 문자열
  • 출력 : 문자열에서 각 소문자 a~z의 개수 (공백 구분)

 

풀이

카운트 대상이 a~z로 고정되어 있으니, 크기 26의 int 배열을 선언한 뒤, 배열 요소 하나씩을 소문자 하나의 카운트로 사용한다. (알파벳 개수는 26개)

int[] count = new int[26];

ex) count[0] : a의 개수 / count[1] : b의 개수, / … / count[25] : z의 개수

a~z 문자는 아스키코드에서 97~122까지 순차적으로 값을 가지기 때문에, char타입 소문자 - 'a' 연산을 통해 소문자 그룹내에서 해당 문자의 순번을 알아낼 수 있다. 이 순번을 int배열의 index(0~25)로 사용한다. 
ex) 'a' - 'a' = 97-97 = 0  /  'b' - 'a' = 98-97 = 1  /  'z' - 'a' = 122-97 = 25

for(char ch : str.toCharArray()){
    int idx = (int)ch - 'a';
    count[idx]++;
}

 

마지막으로, 문자열의 소문자 개수를 카운트하는 int배열을 공백을 구분자로 하는 하나의 문자열로 출력해야 하는데, Arrays.toString(int[] a) 메서드를 사용하면 아래의 문자열로 변환된다.

String result = Arrays.toString(count);
System.out.println(result);
[1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

 

문제에서 원하는 값은 앞뒤 대괄호와 쉼표가 없어야 한다.
replace()substring() 메서드를 사용해 문자열을 적절히 가공해준다.

String result = Arrays.toString(count);
System.out.println(result.substring(1, result.length()-1).replace(",", ""));
1 1 0 0 1 0 0 0 0 1 1 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0
  • substring(1, result.length()-1) : 문자열 맨앞, 맨뒤의 대괄호[ ]를 자르기 위해 사용
  • replace(",", "") : 숫자 사이마다 존재하는 쉼표를 전부 공백으로 대체(제거)하기 위해 사용

 

코드

import java.util.Scanner;
import java.util.Arrays;

public class Main{
    public static void main(String[] agrs){
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int[] count = new int[26];
        
        for(char ch : str.toCharArray()){
            int idx = (int)ch - 'a';
            count[idx]++;
        }
        
        String result = Arrays.toString(count);
        System.out.println(result.substring(1, result.length()-1).replace(",", ""));
    }
}
728x90
Comments