Algorithm

[Java] 백준 문제 10809 알파벳 찾기

isaac.kim 2022. 5. 27.
728x90
반응형

[Java] 백준 문제 10809 알파벳 찾기

 

백준 웹 사이트에서 문제 > 단계별로 풀어보기에서 문제를 확인할 수 있다.

 

이번 문제의 번호는 10809번이고 제목은 '알파벳 찾기'이다.

 

 

반응형

 

 

 

문제는 다음과 같다.

 

 

입력출력 조건은 다음과 같다.

 

결과는 다음과 같이 나와야 한다.

 

 

문제를 풀 때마다 드는 생각이지만 변수명 짓는 게 참 어려운 것 같다.

 

아무튼 문제 풀이를 보자.

 

문제 풀이

문제를 풀기 전에 어떻게 문제를 풀 것인가 순서를 작성하면 더 쉽게 코드가 작성될 것이다.

 

1. 필요한 변수를 선언한다.

2. 문자를 입력받는다.

3. 알파벳을 찾아서 해당 알파벳이 몇 번째 인지 담아 넣을 변수를 세팅한다.

4. 알파벳 비교를 위한 알파벳 변수를 세팅한다.

5. 문자열에서 하나씩 비교해서, 알파벳 순서 결과를 세팅한다.

6. 출력한다.

 

간단하게 순서를 작성해봤다.

 

이제 코드로 작성해보자.

 

소스코드

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));
		String S = br.readLine();
		
	}
}

 

 

먼저 JAVA에서 입력을 받기 위해 BufferedReader를 선언한다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 

 

br.readLine()을 사용해 문자열을 입력을 받는다.

String S = br.readLine();

 

 

 

 

다음은 알파벳을 담을 변수와, 알파벳을 찾은 결과를 담을 변수 array들을 선언한다.

char alphabets[] = new char[122-97 + 1];
int  res[] = new int[122-97 + 1];

122-97은 알파벳 소문자의 아스키 값을 기준으로 최댓값에서 최솟값을 뺀 개수인데, 알파뱃 개수가 26개여서 +1을 해준다. 사실 그냥 알파벳 개수 26으로 알고 있으면 그냥 26으로 세팅해도 된다.

 

결괏값을 담는 res 배열의 값은 -1로 초기 세팅해두었다. (배열 초기 값 설정하기, java.util)

Arrays.fill(res, -1);

 

 

그다음은 소문자 알파벳을 세팅한다.

// 소문자 알파벳 세팅
for (int i = 0, j = 97; i <= 122 - 97; j++, i++)  alphabets[i] = (char) j;

 

 

그 다음은 문자열에서 문자를 하나씩 따와서 알파벳의 순서를 찾는다. 

// 문자열 check
for ( int scnt = 0; scnt < S.length(); scnt++ ) {
    char charS = S.charAt(scnt);

    // 비교
    for (int cp = 0; cp < alphabets.length; cp++ )
        if (charS == alphabets[cp] && res[cp] == -1) res[cp] = scnt;
}

하나씩 문자를 따오고, 알파벳과 비교하는 반복문에서 해당 문자 순번을 찾으면 결괏값에 순번을 넣는다.

 

1) 하나씩 문자를 따온다.

// 문자열 check
for ( int scnt = 0; scnt < S.length(); scnt++ ) {
    char charS = S.charAt(scnt);
    . . . .
}

2) 문자와 알파뱃을 비교한다.

3) 따온 문자와 비교할 알파벳이 같고, 알파뱃을 아직 못 찾은 경우(res[index] 값이 -1인 경우)에 res[index] = 문자열 순번을 넣는다. 그럼 몇 번째에 나왔는지 알 수 있다.

// 비교
for (int cp = 0; cp < alphabets.length; cp++ )
    if (charS == alphabets[cp] && res[cp] == -1) res[cp] = scnt;

 

 

 

결과를 출력한다.

for(int o = 0; o < res.length; o++) System.out.print(res[o]+" ");

 

전체 소스

전체 소스를 공개한다.

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));
		String S = br.readLine();
		
		// 초기화
		char alphabets[] = new char[122-97 + 1];
		int res[] = new int[122-97 + 1];
		Arrays.fill(res, -1);
		
		// 소문자 알파벳 세팅
		for (int i = 0, j = 97; i <= 122 - 97; j++, i++)	 alphabets[i] = (char) j;
		
		// 문자열 check
		for ( int scnt = 0; scnt < S.length(); scnt++ ) {
			char charS = S.charAt(scnt);
			
			// 비교
			for (int cp = 0; cp < alphabets.length; cp++ )
				if (charS == alphabets[cp] && res[cp] == -1) res[cp] = scnt;
		}
		
		for(int o = 0; o < res.length; o++) System.out.print(res[o]+" ");
		
	}
}

결과

 

문제에서 요구하는 입출력 결과와 같다.


글이 도움이 되었다면 '좋아요'와 광고 한 번 클릭 부탁드립니다.

글을 작성하는데 큰 힘이 됩니다. : )

감사합니다.

728x90
반응형