[백준/JAVA]10809번 알파벳 찾기

2025. 1. 16. 13:46·코딩테스트/백준

문제

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

알파벳 소문자 a~z가 문자열에 처음 등장하는 위치를 출력하는 문제였다.

문제 풀이

1. 처음 생각한 풀이

import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        //각 알파벳의 첫 번째 등장 위치를 저장하기 위한 변수 초기화
        int a = -1, b = -1, c = -1, d = -1, e = -1, f = -1, g = -1, 
        h = -1, i = -1, j = -1, k = -1, l = -1, m = -1, n = -1, o = -1, 
        p = -1, q = -1, r = -1, s = -1, t = -1, u = -1, v = -1, w = -1, 
        x = -1, y = -1, z = -1;
        
        //입력 문자열 읽기
        String S = br.readLine();
        
        //문자열의 각 문자를 저장할 배열 생성
        char[] array = new char[S.length()];
        
        //배열에 문자열의 각 문자를 저장
        for (int jj = 0; jj < S.length(); jj++) {
            array[jj] = S.charAt(jj);
        }
        
        //배열을 순회하며 각 알파벳의 첫 번째 등장 인덱스를 저장
        for (int ii = 0; ii < S.length(); ii++) {
            if (array[ii] == 'a' && a == -1) { a = ii; }
            else if (array[ii] == 'b' && b == -1) { b = ii; }
            else if (array[ii] == 'c' && c == -1) { c = ii; }
            else if (array[ii] == 'd' && d == -1) { d = ii; }
            else if (array[ii] == 'e' && e == -1) { e = ii; }
            else if (array[ii] == 'f' && f == -1) { f = ii; }
            else if (array[ii] == 'g' && g == -1) { g = ii; }
            else if (array[ii] == 'h' && h == -1) { h = ii; }
            else if (array[ii] == 'i' && i == -1) { i = ii; }
            else if (array[ii] == 'j' && j == -1) { j = ii; }
            else if (array[ii] == 'k' && k == -1) { k = ii; }
            else if (array[ii] == 'l' && l == -1) { l = ii; }
            else if (array[ii] == 'm' && m == -1) { m = ii; }
            else if (array[ii] == 'n' && n == -1) { n = ii; }
            else if (array[ii] == 'o' && o == -1) { o = ii; }
            else if (array[ii] == 'p' && p == -1) { p = ii; }
            else if (array[ii] == 'q' && q == -1) { q = ii; }
            else if (array[ii] == 'r' && r == -1) { r = ii; }
            else if (array[ii] == 's' && s == -1) { s = ii; }
            else if (array[ii] == 't' && t == -1) { t = ii; }
            else if (array[ii] == 'u' && u == -1) { u = ii; }
            else if (array[ii] == 'v' && v == -1) { v = ii; }
            else if (array[ii] == 'w' && w == -1) { w = ii; }
            else if (array[ii] == 'x' && x == -1) { x = ii; }
            else if (array[ii] == 'y' && y == -1) { y = ii; }
            else if (array[ii] == 'z' && z == -1) { z = ii; }
        }
        
        //각 알파벳의 첫 번째 등장 인덱스 출력
        System.out.printf("%d %d %d %d %d %d %d %d %d %d 
        %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
        a, b, c, d, e, f, g, h, i, j, k, l, m, 
        n, o, p, q, r, s, t, u, v, w, x, y, z);
    }
}

각 변수의 초기값을 -1로 설정하여 알파벳이 등장하지 않았음을 나타내고, 처음 등장하는 경우에만 인덱스를 저장하는 조건을 추가하는게 중요했다. 이 방법은 직관적이지만 코드가 길고 반복적이다.

2. 간소화한 풀이

import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] positions = new int[26]; //a부터 z까지의 인덱스를 저장할 배열 생성
        for (int i = 0; i < 26; i++) {
            positions[i] = -1; //초기값을 -1로 설정
        }

        String S = br.readLine();
        for (int j = 0; j < S.length(); j++) {
            char ch = S.charAt(j);
            if (ch >= 'a' && ch <= 'z') { //소문자 알파벳인지 확인
                int index = ch - 'a'; //알파벳의 인덱스 계산
                if (positions[index] == -1) { //처음 등장하는 경우
                    positions[index] = j; //인덱스 저장
                }
            }
        }

        //결과 출력
        for (int pos : positions) {
            System.out.print(pos + " ");
        }
    }
}

배열을 사용하여 각 알파벳의 인덱스를 저장함으로써 코드가 간결해졌다. 각 알파벳의 인덱스를 계산하여 처음 등장하는 경우에만 저장하는 방식으로, 가독성이 향상되었다.

3. HashMap 사용

import java.io.*; 
import java.util.HashMap; 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        //알파벳과 그 첫 번째 등장 위치를 저장할 해시맵 생성
        HashMap<Character, Integer> result = new HashMap<>();
        
        //사용자로부터 문자열 입력 받기
        String S = br.readLine(); 
        
        for (int j = 0; j < S.length(); j++) {
            char c = S.charAt(j); //현재 인덱스 j의 문자 c를 가져옴
            
            //c가 소문자 알파벳(a-z)이고, 해시맵에 존재하지 않는 경우
            if (c >= 'a' && c <= 'z' && !result.containsKey(c)) {
                //알파벳 c와 그 인덱스 j를 해시맵에 저장
                result.put(c, j); //c: 알파벳, j: 인덱스 
            }
        }
        
        //알파벳 'a'부터 'z'까지 반복
        for (char c = 'a'; c <= 'z'; c++) {
            //각 알파벳의 첫 번째 등장 위치를 출력, 없으면 -1 출력
            System.out.print(result.getOrDefault(c, -1) + " ");
        }
    }
}

HashMap을 사용하여 각 알파벳과 그 첫 번째 등장 위치를 동적으로 저장할 수 있어 유연성이 높아졌다. 코드가 간결하고 가독성이 좋으며, 새로운 알파벳을 추가할 필요가 없다. 그러나 메모리 사용량이 증가할 수 있으며, 성능이 배열보다 느릴 수 있다.

4. String 클래스의 indexOf  메서드 사용

import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String S = br.readLine();
        
        for (char c = 'a'; c <= 'z'; c++) {
            //각 알파벳의 첫 번째 등장 위치를 찾음
            int index = S.indexOf(c);
            System.out.print(index + " ");
        }
    }
}

String 클래스의 indexOf 메서드를 사용하여 각 알파벳의 첫 번째 등장 위치를 간단하게 찾을 수 있다. 이 메서드는 지정한 문자가 문자열 내에 존재하지 않을 경우 -1을 반환한다. 코드가 매우 간결하고 이해하기 쉽지만, 문자열을 여러 번 검색해야 하므로 성능이 떨어질 수 있다.

'코딩테스트 > 백준' 카테고리의 다른 글

[백준/JAVA]1152번 단어의 개수  (0) 2025.01.17
[백준/JAVA]2675번 문자열 반복  (0) 2025.01.16
[백준/JAVA]11720번 숫자의 합  (0) 2025.01.16
[백준/JAVA]11654번 아스키 코드  (1) 2025.01.15
[백준/JAVA]9086번 문자열  (0) 2025.01.15
'코딩테스트/백준' 카테고리의 다른 글
  • [백준/JAVA]1152번 단어의 개수
  • [백준/JAVA]2675번 문자열 반복
  • [백준/JAVA]11720번 숫자의 합
  • [백준/JAVA]11654번 아스키 코드
yxxjxxeee
yxxjxxeee
  • yxxjxxeee
    공부 일지
    yxxjxxeee
  • 전체
    오늘
    어제
    • study N
      • Framework
        • Spring
      • Language
        • JavaScript
        • C | C++
        • JAVA
        • PHP
      • CS
        • 네트워크
        • 자료구조
        • 데이터베이스
        • 운영체제
      • DBMS
        • MySQL
      • 코딩테스트 N
        • 백준 N
        • 프로그래머스
        • LeetCode
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 쇼핑몰 제작 프로젝트(PHP)
    • github
  • 공지사항

  • 인기 글

  • 최근 글

  • hELLO Designed By 정상우
    Version v4.10.2
yxxjxxeee
[백준/JAVA]10809번 알파벳 찾기
상단으로

티스토리툴바