Algorithm/BOJ

[백준 - 10809] - 알파벳 찾기 (java)

connieya 2021. 5. 17. 11:50

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

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

 

알파벳 찾기

 

풀이.

java의 String 메소드 중 하나인 indexOf()를 사용하면 간단히 해결 할 수 있는 문제이다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args)  {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        for (char  c= 'a'; c<='z'; c++ ){
            System.out.print(str.indexOf(c)+" ");
        }


    }
}

알파벳 a 부터 z 까지 indexOf() 메소드를 사용하여

 

입력 받은 문자열의 위치를 리턴 받고 그 값을 출력해주면 된다. 

 

 


indexOf() 메소드를 사용하지 않고 풀 수도 있다.

 

배열을 이용하면 된다.

 

1. 알파벳 소문자는 26개 이기때문에,  크기가 26인 배열을 만든다.

2. 배열의 모든 인덱스를 -1로 초기화 한다.

3. 아스키 코드를 이용하여 배열 인덱스에 문자열의 위치를 초기화 한다.

 

 for (int j = 0; j < str.length(); j++) {
            char character = str.charAt(j);
            arr[character - 97] = j;
     }

 

소문자 a ~ z는 아스키 코드 97~122 이다.

 

입력 예제 : baekjoon를 보면

 

b는 아스키코드 98이기 때문에  arr[98-97] => arr[1] 로 알바벳 b의 인덱스 번호와 동일하다.

 

이를 이용하여 for 문으로 문자열의 위치를 탐색하여

 

값을 초기화 해주면 된다.

 

여기서 주의해야 할 점은

문제에서 각 각의 알파벳이 처음 등장하는 위치를 출력하라는 조건이 있기 때문에

'baekjoon' 예제 처럼  중복된 문자열이 있는 경우, 

 

해당 문자열의 위치로 초기화 했으면 , 다시 초기화 할 수 없게 설정해주면 된다.

 

즉 , 해당 인덱스의 값이 -1일 때만, 초기화 하라는 조건을 주면 된다.

(다시 초기화 할 수 없다.)

 

이를 코드로 구현하면 다음과 같다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        int arr[] = new int[26];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = -1;
        }
        for (int j = 0; j < str.length(); j++) {
            char character = str.charAt(j);
            if (arr[character - 97] == -1) {
                arr[character - 97] = j;
            }
        }
        for (int v : arr) {
            System.out.print(v + " ");
        }


    }
}