(Java) 백준 10809번 - 알파벳 찾기

코딩너구리·2026년 1월 16일

코딩 문제 풀이

목록 보기
162/266

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

문제

> 알파벳 소문자로만 이루어진 단어 S가 주어진다. 
> 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를,
포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

접근

일단 알파벳의 개수가 26개이므로 정수형 배열을 크기 26으로 초기값 -1을 준 상태로 선언해준다.
문자열인 단어 S를 입력받고 S의 각각의 문자에 대해 접근해서 이를 정수로 변환해 인덱스로 사용해 배열에 접근한다. 문제에서 처음 등장한 위치를 저장하라고 했으므로 배열에 접근했을 때, 값이 -1이면 해당 문자가 S에 몇번째 위치에 있는지 저장하고 -1이 아니면(이미 나온적이 있다) 넘어간다.

문제해결

> 문자열 S를 입력받고 정수형 배열 alpha를 26의 크기로 선언해준다.
> Arrays.fill을 통해 alpha 배열을 초기값 -1로 채운다.
> 문자열 S에대해 길이 만큼 반복문을 돌며 각 단어를 S.charAt()으로 가져와 a를 뺴서 정수로 변환한다.
> 이 값을 인덱스로 하여 alpha 벡터에 접근하는데
이미 저장된 바가 있으면 스킵하고 없으면 해당 인덱스에 i값을 저장한다.
> i값은 S에 대해 해당 문자가 몇번째로 나오는지를 말한다.
> 저장이 모두 끝났으면 alpha배열을 처음부터 끝까지 출력한다.

코드

import java.io.*;
import java.util.*;
import java.lang.*;

public class Main
{
    //10809번 알파벳 찾기
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String S = br.readLine();

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

        for(int i = 0; i < S.length(); i++)
        {
            int idx = S.charAt(i) - 'a';
            if(alpha[idx] == -1) alpha[idx] = i;
        }

        for(int i : alpha) System.out.print(i + " ");
    }
}

후기

정수형 변수에 br에 대한 입력을 받으려면 parseInt로 받아야 하는데 이는 br이 문자열로 입력을 저장하기 때문이다. 그래서 문자열을 다룰 땐 그냥 br.readLine()하면 된다.
또 Arrays.fill에 대해 배웠다. c++에선 vector선언하고 뒤에 크기, 초기값으로 주면 됐지만 자바는 이걸쓴다고 한다. 그립다 c++
또 c++에선 반복문으로 문자열을 마치 배열처럼 s(i)로 접근할 수 있는데 charAt()을 쓰거나 문자열로 변환해버리거나를 해야한다고 한다.
마지막으로 c++에선 auto a : alpha로 써서 반복문 출력할 수 있지만 자바는 auto가 없다고 한다. 그래서 자료형을 내가 잡아줘야한다. 아쉽다.
여기서 코드를 더 줄이려면 마지막 출력문을 StringBuilder로 sb.append(i).append(' ')해주고 반복문 이후 System.out.println(sb)해주면 된다.

0개의 댓글