본문 바로가기
백준 문제 풀이/문자열

(#10809 Java) 알파벳 찾기★

by _비니_ 2023. 8. 26.
문제

 

 

문제 이해

 

위에 예제 입력과 출력을 보고 문제를 이해해보자.

출력은 a부터 z까지 순서대로 각 알파벳이 주어지는 입력에서 몇 번쨰에 등장하는지 출력하는 것이다. (없으면 -1)

a는 인덱스 1번에 등장하므로 1 출력, b는 인덱스 0번, c와 d는 나오지 않으므로 -1 출력... 이런 방식이다!!

 

문제 해결

 

그럼 이를 어떻게 해결해야 할까?! 사실 생각이 잘 안 나서 막막했다.

다른 사람들의 풀이를 찾아봤는데도 제대로 이해하는데 한참 걸린 건 안 비밀 ..

 

우선 코드를 짜기 전에 이 문제를 해결하기 위해 알아야 할 것이 있다.

 

바로 아스키 코드 !!

 

알파벳의 아스키코드는 A는 97, B는 98.. 이렇게 차례대로라고 알고 있으면 된다.

 

인덱스 0번째 자리에 a가, 1번쨰 자리에 b가 담기게 하려면 어떻게 해야할까?

ch의 아스키코드 값에서 'a' 혹은 97을 빼주면 된다.

그럼 a는 0, b는1의 숫자를 가지게 되는 것 !!!

 


아스키 코드를 어떻게 활용하는지 알았으면 다시 처음부터 코드를 짜보장

 

먼저 알파벳은 총 26개이므로 크기가 26인 배열을 만들고, 이를 모두 -1로 초기화 시켜준다.

 

int[] arr = new int[26];

for(int i = 0; i < arr.length; i++) {
	arr[i] = -1;
}

 

문자열 S를 입력 받는다!

 

String S = in.nextLint();

 

그리고 위에서 언급했던 것 처럼 String의 길이만큼 for문을 돌며 26개의 배열에 적절한 숫자를 넣어주면 된다.

만약 S가 baekjoon이고 S.charAt(0)라고 한다면, b에 해당되는 아스키코드 즉 98을 반환한다고 했다.

그럼 이애 'a'를 빼준다면? 1을 반환하게 되는 것이다. ( a가 인덱스 0, b가 인덱스 1, c가 인덱스 2....)

 

for(int i = 0; i < S.length(); i++) {
	char ch = S.charAt(i);
	arr[ch - 'a'] = i;
}

 

근데 여기에서 중요한 걸 하나 놓쳤다. 

주어진 문자열 baekjoon에서 o가 두 번 나온다. 이럴 경우 문제에서는 처음 등장하는 위치를 출력하라고 되어있지만, 위의 코드대로라면 계속 위치를 바꾸며 결국 마지막에 등장한 위치가 출력될 것이다.

이를 방지하기 위해서는 이미 위치가 정해진 배열에 대해서는 위치를 변경하지 말아야 한다.

이 말은 즉 배열의 값이 -1이 아니면 변경하면 안 된다 ( -1로 초기화했는데, -1이 아니면 이미 위치가 변경됐다는 의미)

 

위의 조건을 적용해 다시 코드를 작성하면,

 

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

 

여기까지 적용된 배열 상태는 ?? 

S가 baekjoon이라고 했을 때

 

arr[1] = 0
arr[0] = 1
arr[4] = 2
arr[10] = 3

arr[9] = 4
arr[14] = 5

(o 동일하므로 변경 X => 그대로 5)

arr[13] = 7

 

즉 예제 출력처럼 되는 것!!!!!

 

그리고 배열 출력해주면 끝~~~!! 휴 드디어 완벽 이해 했당

 

for(int result : arr) {
	System.out.print(result + " ");
}

 

최종 코드

 

import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
 
 
		int[] arr = new int[26];
		
		for(int i = 0; i < arr.length; i++) {
			arr[i] = -1;
		}
 
		String S = in.nextLine();
 
		for(int i = 0; i < S.length(); i++) {
			char ch = S.charAt(i);
    
			if(arr[ch - 'a'] == -1) {	
				arr[ch - 'a'] = i;
			}
		}
 
		for(int result : arr) {
			System.out.print(result + " ");
		}
	}
}
반응형

'백준 문제 풀이 > 문자열' 카테고리의 다른 글

(#1152 Java) 단어의 개수  (0) 2023.08.27
(#2675 Java) 문자열 반복  (0) 2023.08.27
(#11720 Java) 숫자의 합  (0) 2023.08.18
(#11654 Java) 아스키 코드  (0) 2023.08.18
(#9086 Java) 문자열  (0) 2023.08.18