[백준] 10809번 - 알파벳 찾기 by Java(자바)

윤소영·2022년 1월 25일
0

백준

목록 보기
2/13

✨ 문제

✨ 풀이

문제를 보고 나서 바로 indexOf를 이용하면 되겠다는 생각이 들었다. indexOf() 메서드를 이용하면 찾는 문자가 없을 때 자동으로 -1을 리턴하므로 사용하면 좋을 것 같다고 생각했다.
🔻 indexOf() 메서드의 사용 방법 4가지

  1. indexOf(String str)
  2. indexOf(String str, int fromIndex)
  3. indexOf(int char)
  4. 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분 정도 걸렸다. 문제 보자마자 어떤 방법으로 풀어야겠다고 생각한 적은 처음인데, 역시 꾸준히가 답이구나 느꼈다. 근데 시간이 좀 길게 나온 것 같아서 조금 더 다른 사람들 코드 보면서 어떻게 작성해야 하는지 더 연습해야겠다. 제출 후 다른 방법을 생각한 것은 코드 비교 부분에 적었다!

profile
Major in IT Engineering(2021.03~)

0개의 댓글