https://www.acmicpc.net/problem/10809
오늘은 백준 10809번 - 알파벳 찾기 문제를 풀었다. 처음에는 문제를 이해하는 데 어려움을 겪었지만, ASCII 값을 활용한 인덱스 계산을 이해하고 나니 해결할 수 있었다.

주어진 단어에서 알파벳 a~z가 처음 등장하는 위치를 찾는다.
만약 해당 알파벳이 단어에 포함되지 않으면 -1을 출력한다.
입력: 단어 (소문자로만 구성)
출력: 알파벳 a~z의 등장 위치 (없으면 -1)
예제
입력: baekjoon
출력: 1 0 -1 -1 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 3 -1 -1 -1 -1 4 -1 -1 -1 -1 6 -1
이 문제를 해결하기 위해 아래의 접근 방식을 사용했다.
각 알파벳의 등장 위치를 저장할 배열 positions[26]을 -1로 초기화한다.
입력 문자열을 순회하면서, 각 문자가 처음 등장한 위치를 저장한다.
알파벳 'a'를 기준으로 ASCII 값을 계산하여 배열의 인덱스를 구한다.
positions 배열을 출력한다.
핵심 아이디어: index = input[i] - 'a'를 사용하면 알파벳을 0~25 범위의 숫자로 변환할 수 있다.
using System;
class Program
{
static void Main()
{
string input = Console.ReadLine();
int[] positions = new int[26];
// 배열을 -1로 초기화
for (int i = 0; i < 26; i++)
{
positions[i] = -1;
}
// 입력 문자열 순회
for (int i = 0; i < input.Length; i++)
{
int index = input[i] - 'a'; // 'a'를 기준으로 인덱스 계산
if (positions[index] == -1) // 처음 등장한 경우에만 저장
{
positions[index] = i;
}
}
// 결과 출력
Console.WriteLine(string.Join(" ", positions));
}
}
ASCII 값을 활용하면 문자 간 연산이 가능하다! 'e' - 'a' 하면 4가 나오는 원리를 알게 되었다.
배열 초기화가 중요하다. 등장하지 않은 알파벳은 -1을 출력해야 하므로, 먼저 배열을 -1로 채우는 것이 핵심이다.
처음 등장한 위치만 저장해야 한다. 이후에 같은 문자가 나와도 업데이트하지 않아야 한다.
이 문제를 풀면서 문자열과 배열을 다루는 방법을 확실히 익힐 수 있었다.