코딩 테스트

[코딩테스트] 백준 10809번: 알파벳 찾기

dev.jelee 2025. 6. 13. 14:04

# 문제

  • 주소: https://www.acmicpc.net/problem/10809
  • 내용: 입력 받은 단어 알파벳 순서를 구하여 a - z 까지 해당 알파벳의 순서를 적용시키고 나머지는 -1로 출력.

 

# 코드

▼ 코드1 - ArrayList 사용

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

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String S = br.readLine(); // 입력받은 단어 한 글자씩 저장
    ArrayList<String> az = new ArrayList<>();
    
    // a-z 반복
    for (char c = 'a'; c <= 'z'; c++) {
      // 입력받은 S에 알파벳 있으면 index값 저장. 없으면 -1
      int index = S.indexOf(c); 
      az.add(String.valueOf(index)); // az ArrayList에 저장.
    }

    for (int i = 0; i < az.size(); i++) {
      System.out.print(az.get(i) + " ");
    }
    br.close();
  }
}

 

▼ 코드2 - int[] 사용

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

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String S = br.readLine();
    int[] az = new int['z' - 'a' + 1]; // 알파벳 길이

    // az에 기본 -1으로 세팅하기
    for (int i = 0; i < az.length; i++) {
      az[i] = -1;
    }

    for (int i = 0; i < S.length(); i++) {
      char c = S.charAt(i); // S의 i번째 문자를 구해 아스키코드 값 저장
      int idx = c - 'a'; // 구한 아스키코드 값에 -'a' (a아스키코드 값)을 해주기

      if (az[idx] == -1) { // apple 처럼 중복되는 문자가 있을 수 있어서 -1이면 조건을 추가
        az[idx] = i;
      }
    }

    for (int i = 0; i < az.length; i++) { // az 출력
      System.out.print(az[i] + " ");
    }

    br.close();
  }
}

 

# 입/출력 결과

▼ 코드1 - ArrayList 결과

 

▼ 코드2 - int[] 결과

 

# 과정

▼ 코드1 - ArrayList 결과

  1. BufferedReader 클래스를 사용하여 입력값 받기.
  2. String S에 단어 입력받기.
  3. ArrayList를 사용, 제너릭은 String을 하여 a-z값을 담을 리스트를 생성.
  4. for문 사용하여 a-z까지 S.indexOf()에 대입하여 index가 있으면 해당 index를, 없으면 -1이 추가 되도록 az.add(String.valueOf())를 사용.
  5. for문 사용하여 az에 담긴 값을 print로 공백을 넣어 한 줄로 출력.
  6. BufferedReader .close() 시키기.

 

▼ 코드2 - int[] 결과

  1. BufferedReader 클래스를 사용하여 입력값 받기.
  2. String S에 단어 입력받기.
  3. int[] az를 알파벳 개수 만큼 크기 생성.
  4. for문으로 az 배열 전체에 -1을 기본값으로 설정.
  5. for문 사용하여 계산.
    • : S.length() 만큼 반복
    • : char c에 S.charAt()을 사용하여 S에 입력 받은 단어 한 글자씩 담기.
    • : int index에  c - 'a'(a의 아스키코드 값)를 빼서 알파벳 몇 번째 순서에 있는지 구하기.
    • : if문을 사용하여 az를 순회하면서 -1 같이면 az[index]에 i값 저장하기.
    • : 왜냐하면 apple 단어에서 p처럼 중복 알파벳이 있을 수도 있기 때문에.
  6. for문 사용하여 az 크기 만큼 반복하여 az 요소들 출력.
  7. br.close(); 해주기.

 

# 느낀 점

  • a-z까지 출력하는 방법을 chat-gpt의 도움을 받았다. 알파벳 개수를 모르는 경우를 대비해서 구할 수 있는 방법이 있는지 chat-gpt가 'z' - 'a' + 1을 하면 된다고 알려주었고, 그에 대한 설명을 읽고 이해했다. 아스키코드 값으록 계산하기 때문에 26이라는 숫자가 나왔다. 그리고 char c에 'a' 값을 담고 반복문으로 c <= 'z'; c++ 을 하면 a부터 z까지의 알파벳을 순회한다는 걸 알게 되었다.
  • .charAt() / .indexOf() 를 이해하는데 도움이 됐다.