알고리즘/백준

10809 - 알파벳 찾기

leegeonwoo 2023. 8. 19. 12:39

알파벳은 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
728x90