[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]+" ");
}
}
결과
문제에서 요구하는 입출력 결과와 같다.
글이 도움이 되었다면 '좋아요'와 광고 한 번 클릭 부탁드립니다.
글을 작성하는데 큰 힘이 됩니다. : )
감사합니다.
'Algorithm' 카테고리의 다른 글
[Java] 백준 문제 2675 문자열 반복 (0) | 2022.06.02 |
---|---|
[Java] 백준 문제 11720 숫자의 합 (0) | 2022.05.12 |
[Java] 백준 문제 11654 아스키 코드 (0) | 2022.05.11 |
[JAVA] 백준 문제 1065 - 한수 (1) | 2022.04.28 |
[Java] 백준 4673 - 셀프 넘버 (0) | 2022.04.25 |