문제 풀이

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

auyeol 2023. 6. 26. 14:11
728x90

 

문제

https://www.acmicpc.net/problem/10809

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net

 

소문자로 이루어진 단어를 입력한 뒤, 각각의 알파벳에 대해서 단어가 처음 등장하는 위치를 출력한다. 단어에 포함되지 않은 알파벳은 -1을 출력하는 문제이다.

 

입력                                    출력
baekjoon				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

 

b는 알파벳의 2번째 순서, 입력한 단어의 첫번째에 등장했기에 출력 값의 2번째에 0을 출력

a는 알파벳의 1번째 순서, 입력한 단어의 두번째에 등장했기에 출력 값의 1번째에 1을 출력

.

.

.

.

 

 

------------------------------------------------------------------------------------------------------------------

 

풀이

Scanner는 배열과 if, charAt()을 통해, BufferedReader는 indexOf() 이용하여 문제를 해결하였다.

 

 

(1) Scanner 사용

 

 

import java.util.Scanner;
import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String str = sc.next();
		sc.close();
		
		int arr[] = new int[26];
		Arrays.fill(arr, -1); // 전부 다 -1로 초기화 
		
		for(int i=0;i<str.length();i++) {
			char ch = str.charAt(i); // b .. a.. e.. k .. 순서대로 
			
			if(arr[ch - 'a']==-1) { //-1인 경우에만 수정 (처음 등장하는 위치 조건)  
				arr[ch-'a'] = i;  
			}
		}
		
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr[i]+" ");
		}
		
		
	}
}

 

단어를 Scanner를 이용하여 값을 받아온 뒤, 배열의 값들을 전부 다 -1로 초기화 하였다.

 

이후, for문을 이용하여 입력한 단어의 길이 n만큼 반복하였다. str의 0번째 글자부터 n번째 글자를 charAt()을 이용하여 

 

값을 char형으로 변경한 다음,  배열에 값을 넣어주었다. ( arr[ch-'a'] = i )

 

 

 

    ex) baekjoon 입력

          0번째 반복 b > arr[ b - 'a' ] > arr[98 - 97] = arr[1] = 0

          1번째 반복 a > arr[ a - 'a' ] > arr[97 - 97] = arr[0] = 1

           ....

 

baekjoon은 단어 o가 2번 중복되어있다. 따라서  (arr[ch-'a'] = i) 이렇게만 한 경우에는 o의 값이 6으로 바뀌게 된다.

 

이를 해결하기 위해서 배열의 값이 초기에 설정한 값 -1인 경우에만 변경할 수 있도록 조건을 설정하였다.

     > if(arr[ch - 'a']==-1) 

 

 

 

------------------------------------------------------------------------------------------------------------------

 

 

(2) BufferdReader 사용 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		String str = br.readLine();
		
		for(char c = 'a';c<='z';c++) {
			sb.append(str.indexOf(c)+" "); // 문자열의 위치를 반환, 없으면 -1을 출력
		}
		System.out.println(sb);

	}

}

 

------------------------------------------------------------------------------------------------------------------

 

 

(2) BufferdReader 사용 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		String str = br.readLine();
		
		for(char c = 'a';c<='z';c++) {
			sb.append(str.indexOf(c)+" "); // 문자열의 위치를 반환, 없으면 -1을 출력
		}
		System.out.println(sb);

	}

}

 

문자열을 더하기 위해서 StringBuilder를 추가해주었다.

 

문자열을 입력받은 뒤, for문을 이용하여 a ~ z까지 반복되게 하였다.

 

입력한 문자열 str이 a ~ z 사이에서의 위치를 알기 위해 str.indexOf(c)를 한 다음, StringBuilder에 더해주었다.

 

 

 

Scanner

BufferedReader

728x90