본문 바로가기
ONLINE JUDGE/문자열

[백준10809] 알파벳 찾기

by W_W_Woody 2022. 3. 8.

https://www.acmicpc.net/problem/10809

 

10809번: 알파벳 찾기

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출

www.acmicpc.net


방법1. 이중포문 시도하던거 -1나오는 곳에서 계속 루프돌아서 실패 

 

indexOf사용해볼까해서 

 

방법2. indexOf() 이용하기

 

문자열도 증감연산자 먹히는구나

 

package s07_string;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MJ_03_10809_3 { 
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String S = br.readLine();

		for(int i='a';i<='z';i++) {
			System.out.print(S.indexOf(i)+" ");
		}
	}
}

 S.indexOf(검색할문자) 못찾으면-1반환

[Java] 💻String의 생성자와 메서드

 

방법3. 배열, charAt() 이용하기 

2번이 코드가 훨씬 간결해서 메모리 적을줄알앗느데 이게 조금 더 적어서 놀람

 

Arrays.fill( 배열명, 넣을 숫자)

package s07_string;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MJ_03_10809_2 { 
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int[] arr = new int [26];//* 먼저 int 형 배열을 하나 생성하여 모두 -1 로 초기화 시킨다
		for(int i = 0; i < arr.length; i++) {
			arr[i] = -1;
		}
		
		String S = br.readLine();
		
		for(int i=0;i<S.length();i++) {
			char ch = S.charAt(i);
			
			if(arr[ch-'a']==-1) {
				arr[ch-'a']=i;
			}
		}
		
		for(int val: arr) {
			System.out.print(val+" ");
		}
		
	}
}

입력받은S를 char형 변수ch에 넣어주는데

ch 의 문자의 위치(인덱스값)를 우리가 앞서 만든 arr 배열의 값으로 바꿔준다.

이때 문제에서 위치(인덱스값)는 0 부터 시작한다고 했으니

ch 의 문자의 위치는 i(0부터시작)가 되는 것을 알 수 있다.

String S = br.readLine();
		
    for(int i=0;i<S.length();i++) {
        char ch = S.charAt(i);

이 때 배열 arr의 인덱스값은

ch값=S.charAt(i)값=아스키코드값 

에서

'a' 또는  97을 빼주면 된다.

 

//대문자아스키코드: 65~90 / 소문자아스키코드: 97~122
//소문자a(97)를 입력받으면 arr의 인덱스값 0 에 들어가야하는데  97-x = 0, x=97
//소문자c(97)를 입력받으면 arr의 인덱스값 2에 들어가야하는데 99-x = 2, x=97
//x값 97를 빼주면 arr의 인덱스값을 알 수 있다

 

동일 문자가 포함되어있는 경우 처음 나타난 위치로 나타내야한다. 

문자열을 앞에서부터 검사할 때, 앞선 동일문자가 존재하여 arr 에 위치를 변경했을 경우는 arr 의 값을 변경하지 않으면 된다.

결국 -1 인 경우(초기설정값)에는 배열의 원소 값을 변경하고

-1 이 아닌 경우(바뀐경우=동일문자가있는 경우) 배열의 원소 값을 변경하지 않고 -1로 냅둔다.

        if(arr[ch-'a']==-1) {
            arr[ch-'a']=i;
        }
    }

 

확장 for문을 통해 출력하는데 한줄에 한 원소와 한 공백을 출력해야 하므로 빈공백" "  도 넣어서 출력해준다.

 

 

'ONLINE JUDGE > 문자열' 카테고리의 다른 글

[백준1152] 단어의 개수  (0) 2022.03.11
[백준1157] 단어 공부  (0) 2022.03.10
[백준2675] 문자열 반복  (0) 2022.03.09
[백준11720] 숫자의 합  (0) 2022.03.05
[백준11654] 아스키 코드  (0) 2022.03.04

댓글