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

 

10809번: 알파벳 찾기

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

www.acmicpc.net

 

흠.. 일단 보고 뭐지라는 생각을 제일 먼저 했습니다.

차근차근 읽어보니 요구하는것은

1. 문자열 입력 받기.

2. 입력받은 문자열이 나오는 순서대로 저장하기 (나오지 않은 알파벳은 -1로 처리)

apple를 예로 들겠습니다

ex) a(0)  p(1)  p(2중복생략)  l(3)   e(4)  

 0(a) -1(b) -1(c) -1(d) 4(e) -1(f) -1(g) -1(h) -1(i) -1(j) -1(k) 3(l) -1(m)

-1(n) -1(o) 1(p) -1(q) -1(r) -1(s) -1(t) -1(u) -1(v) -1(w) -1(x) -1(y) -1(z)

아 

0  -1  -1  -1  4  -1  -1  -1  -1  -1  -1  3  -1  -1  -1  1  -1  -1  -1  -1  -1  -1  -1  -1  -1  -1

결국 위에 값이 나오게 짜야합니다

오늘 아르바이트를 19시에갔는데 가기전에 계속 고민하고

가서도 계속 고민했습니다. (지금은 새벽 두시입니다,,)

어떤식으로 해야 구현할수있을지..

결국 필요한건 아래와 같다고 생각이들었습니다.

1. 문자열 입력받기

2. 비교할 알파벳 문자열(아스키코드)

3. -1과 1번에서 입력받은 문자열 순서 입력할 정수형 배열

4. 1번의 문자열에서 중복값제거하기

apple->ap0le 이런느낌으로요

코드를 짜보겠습니다..

#include<stdio.h>
#include<string.h> //strlen 함수 이용해서 입력받은 문자열 길이를 알아낼거에요

int main(){
//----------------------------------------------------------------------------------------//
    int arr[26]; //알파벳 소문자는 26글자니까 -1,-1,1,2,3... 형식으로 저장될 정수형 배열
    
    char alp[27] ={NULL}; //사실 {a,b,c....} 이런 식으로 초기화 해주어도 괜찮지만
    // 밑에 처럼 for문으로 깔끔하게 나타내고 싶었습니다..(더럽다면.. 죄송합니다)
    // 27인 이유는 문자열은 마지막에 널값이 있어서 꼭 하나 더 추가해주어야합니다 오류남
    
    char input[101]; // 최대 문장의 길이는 100이지만 위와 같은이유로 +1 해서 101
    
//----------------------------------------------------------------------------------------//    
    //배열 -1 대입하기//
    for (int i = 0; i < 26; i++) { // 정수형 배열에 없는 값은 -1로 표현하기로했으니
		arr[i] = -1;               // 26칸에 -1을 넣어줍니다.
	}
//----------------------------------------------------------------------------------------//    
    
    // 문자열에 알파벳 저장하기//
    for(int i=97;i<=122;i++){ // 아스키코드 97~122번은 a~z입니다
    alp[i-97]=i;    //i=97 일때 alp[0]=97, alp[1]=98.. 이런느낌으로 반복저장합니다. 
    		}
	
//----------------------------------------------------------------------------------------//
	
    //문자열 입력받기//
    scanf("%s",input); // 이건 쉽죠..?
    
//----------------------------------------------------------------------------------------//
    
    //*입력받은 문자열에서 중복값 제거 apple -> ap0le 이런느낌*//
    
    for (int i = 0; i < strlen(input); i++) {         
		for (int j = i+1; j < strlen(input); j++) { 
   // 두번째 for문에서 초기값을 i+1로 해두어서 비교할 문자열의 다음 문자부터 비교를해줍니다//
   // 이렇게 하지않으면 자기 자신도 비교하고 중복값으로 판단해 a00le 이렇게 나와요..//
			if (input[i] == input[j])  
				input[j] = '0'; 
		}
	}
	//printf("%s",input); -> ap0le 이렇게 출력됩니다//
    
//----------------------------------------------------------------------------------------//

    // 이제 정수형 배열에 값 저장하기//
    for (int i = 0; i < strlen(input); i++) { //중복값을 제거한 입력값을
		for (int j = 0; j < 26; j++) { // 하나하나 알파벳 전부랑 비교합니다
			if (input[i] == alp[j]) { // 만약 비교하는 값이 알파벳 순서대로 저장한 배열과 일치하면
				arr[j] = i; //알파벳 배열의 위치와 동일하게 정수형배열 arr에 저장해줍니다.
			}
		 }
        }
//----------------------------------------------------------------------------------------//
            for (int i = 0; i < 26; i++) {
            printf("%d ", arr[i]); //출력해주면 끝이에요... %d 뒤에 공백..신경쓰기
        }
    
}

사실 뭔가 분명 더 좋은 방법이 있었겠죠?

댓글로 남겨주시면 감사하겠습니다.

이제 예상한대로 나오는지 입력해볼게요..

apple      bobby    airplane     입력해보겠습니다.

아 기쁘다 해내니까

실수한 부분이나 이상한곳있으면 

지적 꼭 부탁드립니다!

감사합니다

+ Recent posts