[JAVA]백준 알고리즘 10809번 : 알파벳 찾기
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);
}
}
틀린 부분이 있다면 정정해주시면 감사하겠습니다.
궁금한 부분이 있거나, 다른 아이디어가 있으시면 자유롭게 댓글 남겨주세요!