[★2][백준10809번]알파벳 찾기 (JAVA)
카테고리: BKJN
태그: Algorithm Java Coding Test
[★2][백준10809번]알파벳 찾기 (JAVA)
10809번 문제 ☞ https://www.acmicpc.net/problem/10809
난이도 ☞ [★2]
숫자의 합
- 문제
- 알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
- 첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.
-
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, … z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.
만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 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
내가 푼 풀이
String s
표와 arr
표를 서로 비교해보시면서 보십쇼. 어디에 어느게 어떻게 들어가있는지를 보게 된다면 매우 쉽게 풀 수 있는 문제입니다.
String s | |||||||
---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
b | a | e | k | j | o | o | n |
arr | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
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 |
즉, s의 index값이 a-z까지 인덱스 값에 대입이되며, 만약 존재하지 않을 경우 -1로 표현된다고 생각하면 됩니다. 쉽게 다시 아래의 표에 정리해보도록하겠습니다.
입력받은 문자열 | b | a | e | k | j | o | o | n |
String s[index] | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
arr[index] | 1 | 0 | 2 | 3 | 4 | 5 | 7 |
이렇게 되어집니다. 입력받은 문자열 s[index]는 배열에 [0]~[7]까지 저장되어지고, 이 문자열들이 몇번에 배열에 저장되어 있는지 출력하는 것이 arr
이다. 두번째 ‘o’의 대한 값이 없는 이유는 중복되는 단어 ‘o’는 첫번째 ‘o’에는 반영되어지고 두번째 등장하는 ‘o’에 대해서 없는 셈 쳐야한다.
이를 토대로 구현해보았다. 먼저 Scanner
방식이다.
[ 풀이 1 ]
메모리 :
18324KB
시간 :224ms
Scanner, charAt()
import java.util.Scanner;
public class NO10809BOJ {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int[] arr = new int[26];
// 모든 문자열을 -1 로 초기화 시킨다.
for(int i = 0; i < arr.length; i++) {
arr[i] = -1;
}
// 문자열이 주어진다.
String s = s.nextLine();
// 각 문자를 검사하여 charAt()을 사용하여 메서드를 이용한 문자를 추출한다.
for(int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if(arr[ch - 'a'] == -1) { // arr 원소 값이 -1 인 경우에만 초기화
arr[ch - 'a'] = i;
}
}
for(int v : arr) { // 배열 출력
System.out.print(v + " ");
}
}
}
chatAt()
을 사용하였으며, arr
배열을 만들 때 -1로 초기화를 먼저 시켜주어야한다.
if(arr[ch - 'a'] == -1) { // arr 원소 값이 -1 인 경우에만 초기화
arr[ch - 'a'] = i;
}
이 구문으로 -1
인 경우에만 대입이 되어지도록 조건을 부여한다.
두밴째 풀이는 늘하던 BufferedReader
가 메인인 방식말고, 이번엔 indexOf()
를 사용해보려고 한다. indexOf()
를 사용하게 되면 위의 코드보다는 간결하게 표현할 수 있다. 코드는 아래와 같다.
[ 풀이 2 ]
메모리 :
15900KB
시간 :144ms
BufferedReader, indexOf()
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 s = br.readLine();
for (char c = 'a'; c <= 'z'; c++)
sb.append(s.indexOf(c) + " ");
System.out.println(sb);
}
}
indexOf()
는 문자열 중 입력받은 문자열이 있다면 해당 문자 위치에 맞는 인덱스 값을 리턴하며, 반대로 문자가 없다면 -1
을 출력을 합니다. 그래서 코드를 조금 더 간결하게 사용할 수 있었습니다.
댓글 남기기