문제
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
'문제 풀이' 카테고리의 다른 글
[백준] 1152번: 단어의 개수 - JAVA (자바) (0) | 2023.06.28 |
---|---|
[백준] 2675번: 문자와 문자열 - JAVA (자바) (0) | 2023.06.27 |
[백준] 11720번: 숫자의 합 - JAVA (자바) (0) | 2023.06.25 |
[백준] 11654번: 아스키 코드 - JAVA (자바) (0) | 2023.05.29 |
[백준] 9086번: 문자열 - JAVA (자바) (0) | 2023.05.28 |