[★2][백준10809번]알파벳 찾기 (JAVA)

Date:     Updated:

카테고리:

태그:

[★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을 출력을 합니다. 그래서 코드를 조금 더 간결하게 사용할 수 있었습니다.

BKJN 카테고리 내 다른 글 보러가기

댓글 남기기