[백준] 10809번 - 알파벳 찾기 by Java(자바)
✨ 문제
✨ 풀이
문제를 보고 나서 바로 indexOf를 이용하면 되겠다는 생각이 들었다. indexOf() 메서드를 이용하면 찾는 문자가 없을 때 자동으로 -1을 리턴하므로 사용하면 좋을 것 같다고 생각했다.
🔻 indexOf() 메서드의 사용 방법 4가지
- indexOf(String str)
- indexOf(String str, int fromIndex)
- indexOf(int char)
- indexOf(int char, int fromIndex)
✔️ 위치를 찾아 그 위치를 반환하는 메서드이므로 리턴형은 int임을 기억하기!
✔️ 1. indexOf(String str) 메서드
👉🏻 문자열에서 찾고자 하는 문자열을 매개변수로 전달하면, 앞에서부터 해당 문자열을 찾아 그 인덱스를 반환한다.
✔️ 2. indexOf(String str, int fromIndex)
👉🏻 문자열에서 찾고자 하는 문자열과 "찾는 것을 시작할 위치(인덱스)"를 매개변수로 전달한다.
🔻 예시로 보는 indexOf(String str), indexOf(String str, int fromIndex) 메서드
public class Main {
public static void main(String[] args) {
String str = "abcdefghi bcdabcde";
System.out.println(str.indexOf("bc")); // 1
System.out.println(str.indexOf("bc", 5)); // 2
}
}
👉🏻 1의 출력 결과는 1, 2의 출력 결과는 10이다. 1의 경우 맨 앞 a부터 bc를 찾기 시작해 인덱스 1의 b와 인덱스 2의 c를 찾고 b의 위치인 1을 반환한다. 2의 경우 인덱스 5, 즉, f에서 bc를 찾기 시작한다.
✔️ 3. indexOf(int char)
👉🏻 1과의 차이는 'A'와 "A"의 차이를 생각하면 된다. 즉 문자 'A'인지 문자열 "A"인지에 차이가 있는 것이다.
✔️ 4. indexOf(int char, int fromIndex)
👉🏻 2와의 차이는 1과 3 사이의 차이와 같다. 다만 2와 같이 문자/문자열을 찾기 시작하는 인덱스를 지정할 수 있는 것이다.
📍 만약 뒤에서부터 원하는 문자열이나 문자를 찾고 싶다면?
✔️ lastIndexOf() 메서드 사용하기!
👉🏻 lastIndexOf() 메서드는 뒤에서부터 문자나 문자열을 찾는다.
✨ 최종 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// .indexOf() 사용하기
public class Baek_10809 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
for(int i = 'a'; i <= 'z'; i++) { // 첫 제출 틀린 이유 --> i < 'z' 라고 했음 (i <= 'z'라고 해야 한다.)
System.out.print(str.indexOf(i) + " ");
}
}
✨ 결과
📍 제출 후 다른 풀이 생각해보기
int 배열과 for 반복문, charAt() 메서드 사용하기
charAt(int index) 메서드
: 문자열의 위치 index에 해당하는 문자를 리턴한다. 즉, 리턴형은 char이다.
🔻 제출 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
// 배열의 모든 요소에 -1을 대입하고 각 알파벳의 개수를 세서
int[] cnt = new int[26];
for(int i = 0; i < 26; i++){
cnt[i] = -1;
}
for(int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if(cnt[ch-'a'] == -1) {
cnt[ch-'a'] = i;
}
}
for(int i : cnt) {
System.out.print(i + " ");
}
}
}
🔻 채점 결과
👉🏻 메모리도 시간도 아주아주 조금씩 줄었다. 그래도 줄인 것에 의의를 두고.. 다른 방법도 생각해봐야겠다.
✨ 느낀 점
최종 코드 주석에서 볼 수 있듯이 첫 제출 때 틀려서 당황했지만,, 천천히 살펴보니 for 반복문에서 i < 'z'라고 적은 것을 발견했다.. 자주 <=와 <를 잘못 써서 틀리는데 이 점을 주의해야겠다. 푸는 시간은 5분 정도 걸렸고 틀린 것 고치기까지 포함하면 한 7분 정도 걸렸다. 문제 보자마자 어떤 방법으로 풀어야겠다고 생각한 적은 처음인데, 역시 꾸준히가 답이구나 느꼈다. 근데 시간이 좀 길게 나온 것 같아서 조금 더 다른 사람들 코드 보면서 어떻게 작성해야 하는지 더 연습해야겠다. 제출 후 다른 방법을 생각한 것은 코드 비교 부분에 적었다!
Author And Source
이 문제에 관하여([백준] 10809번 - 알파벳 찾기 by Java(자바)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ddo_0/알고리즘-백준-10809번-알파벳-찾기-by-Java자바저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)