import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Q10809 {
public static void main(String[] args) throws IOException {
String inputString = input();
output(inputString);
}
static String input() throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
return br.readLine();
}
static void output(String inputString) {
int[] stringArray = new int[26];
Arrays.fill(stringArray, -1);
for (int i = 0; i < inputString.length(); i++) {
char currentChar = inputString.charAt(i);
int index = currentChar - 'a';
if (stringArray[index] == -1) stringArray[index] = i;
}
for (int string : stringArray) {
System.out.print(string + " ");
}
}
}
풀이 자체는 단순한데 자바의 문법에 익숙하지 않아서 조금 걸렸다.
int[] stringArray = new int[26];
Arrays.fill(stringArray, -1);
일단 알파벳 개수의 길이만큼 배열을 생성하고 그 배열을 -1로 채웠다. 이후 입력받은 글자열들을 순회하면서 해당 글자열이 처음 등장한다면 글자열의 인덱스에 대응하는 배열의 인덱스의 값을 바꾼다면 해당 알파벳이 몇 번째에 처음 등장하는지 알 수 있다.
이때 활용한 자바 내장 라이브러리인 **util.Arrays.fills**
메서드를 활용하면 해당 배열의 값을 동일하게 채워넣을 수 있다.
for (int i = 0; i < inputString.length(); i++) {
char currentChar = inputString.charAt(i);
int index = currentChar - 'a';
if (stringArray[index] == -1) stringArray[index] = i;
입력 문자열 inputString의 길이 만큼 반복하면서 해당 문자열의 글자들을 하나씩 확인했다.
이때 charAt 메서드를 활용하면 해당 인덱스에 대응하는 문자열을 반환받을 수 있다. 이러한 동작방식을 활용해서 해당 문자열의 문자들을 순서대로 확인할 수 있다.
또한 알파벳의 길이만큼 정수형 배열인 stringArray를 선언했으니까 해당되는 인덱스의 값을 바꿔줘야한다. 그래서 선택한 것이 **현재 문자열 - a**
를 하는 연산을 수행한 것이다.
자바에서는 char타입이 내부적으로 정수로 표현되기 때문에 문자에 대한 연산이 가능하고 그 결과값을 정수로 반환할 수 있다. 그래서 알파벳 문자를 0 - 25 사이의 정수로 변환해서 배열의 인덱스로 활용할 수 있게 된다.
그래서 해당되는 배열의 인덱스가 -1일 경우 아직 해당 알파벳은 문자열에서 등장하지 않았다는 것이므로 배열의 인덱스를 문자열에서 등장한 인덱스로 바꾸면 된다. 이렇게 문자열을 순회하면 배열의 값들이 문자열에서 처음 등장한 인덱스 값으로 바뀌게 된다.
for (int string : stringArray) {
System.out.print(string + " ");
}
문제에서 원하는 출력 값은 한 줄의 형태로 각 배열의 값들을 한 칸의 공백을 두고 출력되는 것이다.
어차피 배열의 모든 값들을 순회하는 것이기 때문에 인덱스를 활용할 필요가 없을 때는 for-each 반복문을 사용하는게 가독성있는 코드를 작성하는 방법이다.