[알고리즘] 알파벳 찾기 - 백준

da__ell·2023년 5월 2일
0

DataStructure / ALGORITHM

목록 보기
21/23
post-thumbnail

문제

10809번: 알파벳 찾기

풀이 - Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Q10809 {
    public static void main(String[] args) throws IOException {
        String inputString = input();
        output(inputString);
    }

    static String input() throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        return br.readLine();
    }

    static void output(String inputString) {
        int[] stringArray = new int[26];
        Arrays.fill(stringArray, -1);

        for (int i = 0; i < inputString.length(); i++) {
            char currentChar = inputString.charAt(i);
            int index = currentChar - 'a';
            if (stringArray[index] == -1) stringArray[index] = i;
        }
        for (int string : stringArray) {
            System.out.print(string + " ");
        }
    }
}

풀이 자체는 단순한데 자바의 문법에 익숙하지 않아서 조금 걸렸다.

int[] stringArray = new int[26];
Arrays.fill(stringArray, -1);

일단 알파벳 개수의 길이만큼 배열을 생성하고 그 배열을 -1로 채웠다. 이후 입력받은 글자열들을 순회하면서 해당 글자열이 처음 등장한다면 글자열의 인덱스에 대응하는 배열의 인덱스의 값을 바꾼다면 해당 알파벳이 몇 번째에 처음 등장하는지 알 수 있다.

이때 활용한 자바 내장 라이브러리인 **util.Arrays.fills** 메서드를 활용하면 해당 배열의 값을 동일하게 채워넣을 수 있다.

for (int i = 0; i < inputString.length(); i++) {
    char currentChar = inputString.charAt(i);
    int index = currentChar - 'a';
    if (stringArray[index] == -1) stringArray[index] = i;

입력 문자열 inputString의 길이 만큼 반복하면서 해당 문자열의 글자들을 하나씩 확인했다.

이때 charAt 메서드를 활용하면 해당 인덱스에 대응하는 문자열을 반환받을 수 있다. 이러한 동작방식을 활용해서 해당 문자열의 문자들을 순서대로 확인할 수 있다.

또한 알파벳의 길이만큼 정수형 배열인 stringArray를 선언했으니까 해당되는 인덱스의 값을 바꿔줘야한다. 그래서 선택한 것이 **현재 문자열 - a**를 하는 연산을 수행한 것이다.

자바에서는 char타입이 내부적으로 정수로 표현되기 때문에 문자에 대한 연산이 가능하고 그 결과값을 정수로 반환할 수 있다. 그래서 알파벳 문자를 0 - 25 사이의 정수로 변환해서 배열의 인덱스로 활용할 수 있게 된다.

그래서 해당되는 배열의 인덱스가 -1일 경우 아직 해당 알파벳은 문자열에서 등장하지 않았다는 것이므로 배열의 인덱스를 문자열에서 등장한 인덱스로 바꾸면 된다. 이렇게 문자열을 순회하면 배열의 값들이 문자열에서 처음 등장한 인덱스 값으로 바뀌게 된다.

for (int string : stringArray) {
            System.out.print(string + " ");
        }

문제에서 원하는 출력 값은 한 줄의 형태로 각 배열의 값들을 한 칸의 공백을 두고 출력되는 것이다.

어차피 배열의 모든 값들을 순회하는 것이기 때문에 인덱스를 활용할 필요가 없을 때는 for-each 반복문을 사용하는게 가독성있는 코드를 작성하는 방법이다.

profile
daelkdev@gmail.com

0개의 댓글