알파벳은 26개로 구성되어있다. 따라서 a,b,c .... z까지의 알파벳을 의미해주는 배열 arr를 선언해준다.
이 배열은 말그대로 알파벳의 위치만을 알려주는 배열이므로 int타입으로 선언해준다.
배열에 각 인덱스에 입력된 알파벳이 단어에 포함되어있지 않다면 -1을 출력해야하므로 모든 인덱스를 -1로 초기화해준다.
char타입의 cArr배열을 생성해주는데, cArr배열은 입력된 단어(S)의 알파벳들만을 필요로 하기때문에 S.toCharArray()해준다.
로직을 구현하기전에 알아야 할 점은 baekjoon과 같이 oo가 겹치는 부분이 입력될 수 도있다는 점을 생각해야한다.
그렇기때문에 if(arr[cArr[i]-97] == -1) 조건문을 붙힌것이다.
for문 로컬변수 i = 0이라는 가정하에 식을 풀어보자면
1. cArr[i]-97은 문자 알파벳을 숫자 0번부터 26번으로 변환하는 의미이다.
(a-0, b-1, c-2....z-25)
2. 1번과정을 거치면 if(arr[0] == -1)
arr[0]이 -1이면
arr[cArr[i]-97] = i를 실행한다는 의미이다.
3. arr[cArr[i]-97 = i를 다시 풀어보면
arr[알파벳] = i 라는뜻이다.
조건문의 의미를 해석해보면
arr배열의 모든인덱스는 -1로 초기화해줬으므로 인덱스가 -1일때만 알파벳 위치를 표시해준다는것이다.
이는 문제에서 제시된 단어에 포함되어있는 경우에는 처음 등장하는 위치를 출력한다. 라는 조건을 만족한다.
만족한다면 arr[cArr[i]-97] = i를 실행한다.
여기서 arr[cArr[i]-97]는 알파벳을 의미하고 i는 알파벳의 위치를 의미한다.
package boj;
import java.util.Scanner;
public class b10809 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String S = sc.next();
int[] arr = new int[26];
for(int i=0; i<arr.length; i++) {
arr[i] = -1;
}
char[] cArr = S.toCharArray();
for(int i=0; i<cArr.length; i++) {
if(arr[cArr[i]-97] == -1)
arr[cArr[i]-97] = i;
}
for(int tmp : arr) {
System.out.print(tmp + " ");
}
}
}
//abejkno
'알고리즘 > 백준' 카테고리의 다른 글
1152 - 단어의 개수 (0) | 2023.08.22 |
---|---|
2675 - 문자열 반복 (0) | 2023.08.22 |
11720 - 숫자의 합 (0) | 2023.08.19 |
11654 - 아스키코드 (0) | 2023.08.19 |
9086 - 문자열 (0) | 2023.08.19 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!