문제
문제 이해
위에 예제 입력과 출력을 보고 문제를 이해해보자.
출력은 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 |