728x90

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

 

10809번: 알파벳 찾기

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

www.acmicpc.net

문제

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

 

풀이

각 알파벳이 몇 번째에 처음 나오는지 검사하고, 출력하는 문제이다.

String 클래스의 charAt() 메서드를 사용하면 어렵지 않게 해결할 수 있다.


🔔 자세한 코드 설명은 더보기 란에 작성하였습니다.

더보기

1. 각 알파벳이 몇 번째에 처음 나오는지 검사하기 위한 int 배열을 만든다.

int[] exist = new int[26];

 

2. BufferedReader 클래스를 이용하여 문자열을 입력받는다.

String S = br.readLine();

 

3. 문자열의 문자 개수만큼 반복문을 돌린다.

3-1. alphabet 변수에 charAt() 메서드를 사용하여 문자열의 문자를 하나씩 받아와 a ~ z의 문자를 0 ~ 25 사이의 수로 변환한다. ('a'를 빼는 이유 : charAt() 메서드를 사용하면 아스키코드값으로 변환하기 때문에 0 ~ 25 사이의 수로 만들기 위함)

3-2. 해당 알파벳이 한 번도 나오지 않았을 경우에만 몇 번째에 해당 알파벳이 나왔는지 입력한다.

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

 

4. 조건에 맞게 결과를 sb에 입력한다.(sb : StringBuilder 클래스 객체)

* exist 배열에서 1을 빼는 이유 : 처음 배열을 선언하였을 때 초기화를 하지 않으면 모든 index에 0이 입력된다.

따라서 문제의 조건과 다르게 첫 번째 입력되는 수를 1번째 위치라고 입력하였다.(0번째 위치라고 0을 입력하면 첫 번째로 입력이 된 것인지, 입력이 되지 않은 알파벳인지 구별할 수 없음.)

또한 문제의 조건에서 한 번도 나오지 않은 알파벳은 -1을 출력해야 하기 때문에, 출력할 때 모든 배열의 값에서 1을 빼주면 조건을 만족할 수 있게 된다.

for(int i = 0; i < 26; i++) {
    sb.append(exist[i] - 1).append(" ");
}

 

5. sb를 출력한다.

System.out.println(sb);

코드

BufferedReader 클래스 StringBuilder 클래스를 이용한 코드

import java.io.*;

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

        int[] exist = new int[26];
        String S = br.readLine();
        for(int i = 0; i < S.length(); i++) {
            int alphabet = S.charAt(i) - 'a';
            if(exist[alphabet] == 0) exist[alphabet] = i + 1;
        }
        for(int i = 0; i < 26; i++) {
            sb.append(exist[i] - 1).append(" ");
        }
        System.out.println(sb);
    }
}

 

틀린 부분이 있다면 정정해주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!

728x90

+ Recent posts