출처:https://www.acmicpc.net/problem/10809
흠.. 일단 보고 뭐지라는 생각을 제일 먼저 했습니다.
차근차근 읽어보니 요구하는것은
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 입력해보겠습니다.
아 기쁘다 해내니까
실수한 부분이나 이상한곳있으면
지적 꼭 부탁드립니다!
감사합니다
'C언어 > 매일 매일 안빼먹기' 카테고리의 다른 글
(C언어) 백준 1254: 모음 숫자 세기 / scanf( ),getchar( ) (0) | 2023.08.01 |
---|---|
(C언어) int 범위 초과하는 숫자 계산(1) / 문자열 역순으로 바꾸기 (0) | 2022.11.14 |
(C언어) 현재 시간 출력하기 (0) | 2022.11.12 |
(C언어) 배열 안에 여러 값들 비교하여 중복 값만 출력하기 (0) | 2022.11.10 |
(C언어) scanf 문자형 입력 오류 getchar() 해결 (0) | 2022.11.10 |