알파벳 찾기 - 10809번 (Java 풀이)
문제
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
출력
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.
만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.
예제 입력 1
baekjoon
예제 출력 1
1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
내가 해당 문제를 처음봤을 때 가장 먼저 떠올랐던 풀이방법은 알파벳 숫자의 갯수-1만큼인 길이가26인 배열을 선언하여 a부터 z까지 -1값으로 세팅해둔 뒤 beakjoon을 입력받았다면 첫문자를 해당 문자열을 for문과 charAt을 활용하여 순회하며 a~z까지의 문자와 일치하는지 판단하는 if,else if,문을 통해 b라면 배열[1] 값에 순회중인 index값을 넣어(입력받은 문자의 위치) j는 index가 4이며 if조건문에서 j와 일치하면 arr[10]의 값을 index인4로 바꾸는 형태의 로직을 떠올렸고 현재 나의 수준으로는 이게 최선일 것 같아 해당 방법으로 노가다?식으로 구현해보았다.
package BAEKJOON_10809;
/*
날짜 : 2024.07.16.화
내용 : 백준 10809번 문제 ( 알파벳 찾기 )
*/
import java.util.*;
public class BAEKJOON_10809 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[26];
String str = sc.nextLine();
for(int i=0; i<26; i++) { // 모든 알파벳에 -1을 대응시켜두기
arr[i] = -1;
}
for(int i=0; i<str.length(); i++) { // 입력받은 문자열을 charAt과 반복문을 활용하여 순회하며 일치하는 알파벳이 있을 경우 해당위치의 인덱스를 해당 자리의 value로 건네주기
if (str.charAt(i) == 'a') {
arr[0] = i;
} else if (str.charAt(i) == 'b') {
arr[1] =i;
} else if (str.charAt(i) == 'c') {
arr[2] =i;
} else if (str.charAt(i) == 'd') {
arr[3] =i;
} else if (str.charAt(i) == 'e') {
arr[4] =i;
} else if (str.charAt(i) == 'f') {
arr[5] =i;
} else if (str.charAt(i) == 'g') {
arr[6] =i;
} else if (str.charAt(i) == 'h') {
arr[7] =i;
} else if (str.charAt(i) == 'i') {
arr[8] =i;
} else if (str.charAt(i) == 'j') {
arr[9] =i;
} else if (str.charAt(i) == 'k') {
arr[10] =i;
} else if (str.charAt(i) == 'l') {
arr[11] =i;
} else if (str.charAt(i) == 'm') {
arr[12] =i;
} else if (str.charAt(i) == 'n') {
arr[13] =i;
} else if (str.charAt(i) == 'o') {
arr[14] =i;
} else if (str.charAt(i) == 'p') {
arr[15] =i;
} else if (str.charAt(i) == 'q') {
arr[16] =i;
} else if (str.charAt(i) == 'r') {
arr[17] =i;
} else if (str.charAt(i) == 's') {
arr[18] =i;
} else if (str.charAt(i) == 't') {
arr[19] =i;
} else if (str.charAt(i) == 'u') {
arr[20] =i;
} else if (str.charAt(i) == 'v') {
arr[21] =i;
} else if (str.charAt(i) == 'w') {
arr[22] =i;
} else if (str.charAt(i) == 'x') {
arr[23] =i;
} else if (str.charAt(i) == 'y') {
arr[24] =i;
} else if (str.charAt(i) == 'z') {
arr[25] =i;
}
}
for(int i=0; i<26; i++) { // 모든 배열안의 값 출력해주기
System.out.printf("%d ", arr[i]);
}
}
}
위와 같이 로직을 짰더니 beakjoon 과 같은 문자열에서 'o' 같은 문자가 중복될때 뒤에 나온 위치로 값이 바뀌는 것때문에 해당 부분에 대해 arr[n]값이 -1일때만 인덱스값으로 value를 변경하는 식으로 예외처리를 하여 코드를 수정해주었다.
('o'가 처음 나온위치인 5로 결과값이 출력되야 하는데 위에 짠 코드에선 6으로 나옴)
package BEAKJOON_10809;
/*
날짜 : 2024.07.16.화
내용 : 백준 10809번 문제 ( 알파벳 찾기 )
*/
import java.util.*;
public class BEAKJOON_10809 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[26];
String str = sc.nextLine();
for(int i=0; i<26; i++) { // 모든 알파벳에 -1을 대응시켜두기
arr[i] = -1;
}
for(int i=0; i<str.length(); i++) { // 입력받은 문자열을 charAt과 반복문을 활용하여 순회하며 일치하는 알파벳이 있을 경우 해당위치의 인덱스를 해당 자리의 value로 건네주기
if (str.charAt(i) == 'a') { // i번째 자리의 문자열이 a였다면 arr[0]번째에 i(해당 문자의 위치)값을 대입
if(arr[0] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[0] = i;
} else if (str.charAt(i) == 'b') {
if(arr[1] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[1] =i;
} else if (str.charAt(i) == 'c') {
if(arr[2] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[2] =i;
} else if (str.charAt(i) == 'd') {
if(arr[3] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[3] =i;
} else if (str.charAt(i) == 'e') {
if(arr[4] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[4] =i;
} else if (str.charAt(i) == 'f') {
if(arr[5] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[5] =i;
} else if (str.charAt(i) == 'g') {
if(arr[6] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[6] =i;
} else if (str.charAt(i) == 'h') {
if(arr[7] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[7] =i;
} else if (str.charAt(i) == 'i') {
if(arr[8] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[8] =i;
} else if (str.charAt(i) == 'j') {
if(arr[9] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[9] =i;
} else if (str.charAt(i) == 'k') {
if(arr[10] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[10] =i;
} else if (str.charAt(i) == 'l') {
if(arr[11] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[11] =i;
} else if (str.charAt(i) == 'm') {
if(arr[12] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[12] =i;
} else if (str.charAt(i) == 'n') {
if(arr[13] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[13] =i;
} else if (str.charAt(i) == 'o') {
if(arr[14] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[14] =i;
} else if (str.charAt(i) == 'p') {
if(arr[15] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[15] =i;
} else if (str.charAt(i) == 'q') {
if(arr[16] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[16] =i;
} else if (str.charAt(i) == 'r') {
if(arr[17] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[17] =i;
} else if (str.charAt(i) == 's') {
if(arr[18] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[18] =i;
} else if (str.charAt(i) == 't') {
if(arr[19] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[19] =i;
} else if (str.charAt(i) == 'u') {
if(arr[20] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[20] =i;
} else if (str.charAt(i) == 'v') {
if(arr[21] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[21] =i;
} else if (str.charAt(i) == 'w') {
if(arr[22] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[22] =i;
} else if (str.charAt(i) == 'x') {
if(arr[23] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[23] =i;
} else if (str.charAt(i) == 'y') {
if(arr[24] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[24] =i;
} else if (str.charAt(i) == 'z') {
if(arr[25] == -1) // beakjoon에서 o과 같이 중복될때 위치가 앞에있는5가 아닌 6으로 출력되는걸 방지하는 예외처리
arr[25] =i;
}
}
for(int i=0; i<26; i++) { // 모든 배열안의 값 출력해주기
System.out.printf("%d ", arr[i]);
}
}
}
해당 문제를 풀고 다른 사람들은 어떻게 풀었는지 참고할겸 블로그를 읽었는데 이렇게 긴 문자열을 아스키코드를 활용해 몇줄로 요약하는걸 보고 현타가 씨게 와버렸다... 역시 아무리 해당 문제를 풀었다고 하여도 다른 사람들의 코드를 참고하는 것은 많은 도움이 되는 것 같다. (분발하자...)
+ 잘려는데 현타가 씨게와서 아스키 코드를 활용해 다시 코드를 짜보려한다...
(아스키 코드활용 풀이)
package BAEKJOON_10809_2;
/*
날짜 : 2024.07.17.수
내용 : 백준 10809번 문제 ( 알파벳 찾기 )
*/
import java.util.*;
public class BAEKJOON_10809_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[26];
String str = sc.nextLine();
for(int i=0; i<26; i++) { // 모든 알파벳에 -1을 대응시켜두기
arr[i] = -1;
}
for(int i=0; i<str.length(); i++) { // 입력받은 문자열을 charAt과 반복문을 활용하여 순회하며 일치하는 알파벳이 있을 경우 해당위치의 인덱스를 해당 자리의 value로 건네주기
if(arr[str.charAt(i)-'a'] == -1) // 소문자의 알바펫들만 입력받으며 1씩 간격으로 문자열들을 순회하는 것을 아스키 코드를 활용해 비교하기
arr[str.charAt(i)-'a'] = i; // i가 2이면 str.charAt(i)는 baekjoon중에 'e'이고, e-a의 아스키코드값은 4, arr[4] == 2
}
for(int i=0; i<26; i++) { // 모든 배열안의 값 출력해주기
System.out.printf("%d ", arr[i]);
}
}
}