#include <stdio.h>
int main(void)
{
int i;
char word[100+1];
char alpha[26] = {'\0'};
scanf("%s", word);
alpha[word[0] - 'a'] = -2;
for (i = 1; word[i] != '\0'; i++)
{
if (!alpha[word[i] - 'a'])
alpha[word[i] - 'a'] = i;
}
for (i = 0; i < 26; i++)
printf("%d ", alpha[i] == 0 ? -1 : alpha[i] == -2 ? 0 : alpha[i]);
return 0;
}
- 풀이방식1
- 첫 번째 occurrence 를 찾은 후 그 인덱스를 alpha에 저장하는 for loop
- alpha를 돌면서 해당 알파벳이 word에 포함되어있는지 아닌지를 출력하는 for loop
0. variables
- word[100+1]: 인풋 c-string
- alpha[26]: a-z까지의 char, word안에서 first occurrence index 저장, 없다면 0으로 초기화
index value meaning
-------- -------- -------------
0 1 word[1] = 'a'
1 -2 word[0] = 'b' //인덱스 0은 예외적으로 -2로 set함
2 0 'c'는 word에 존재하지 않음
... ...
26 2 word[2] = 'z'
...-> word는 "baz..."
1. get the user input for c-string
"word" 입력 (max 100)
2. 실제 인덱스 0과 occurence가 없어서 요소값이 0인 것을 구분하기 위해
word의 인덱스 0에 존재하는 첫번째 char을 가리키는 alpha값을 임의의 값 -2로 set
word[0] - ('a' -1) -1 => word[0] - 'a'3. for loop: "i"의 실제 char이 word에 처음으로 등장한다면, 인덱스를 저장
4. 출력
alpha char array를 돌면서
값이 0이라면 -1(존재하지 않음) 출력
값이 -2이라면 0(인덱스0) 출력
그 외 저장된 값을 출력
- strchr을 활용한 풀이방식2
#include <stdio.h>
#include <string.h>
int main(void)
{
char i;
char word[100+1], *p;
gets(word);
for (i = 'a'; i < 'z' + 1; i++)
{
p = strchr(word, i);
printf("%d ", p==NULL ? -1 : p - word);
}
return 0;
}
- 변수를 줄이고 코드를 단순화할 수 있을 것 같아 시도해보았다
- 하나의 for-loop 안에서 특정 알파벳이 위치한 인덱스를 찾자마자 출력하는 로직
- 불필요한 변수 alpha 삭제
- scanf를 gets로 대체
- strchr과 strchr의 리턴값을 저장할 포인터 변수 선언이 문제풀이의 핵심
- strchr
- #include <string.h>
- char *strchr(const char *string, int c);
- returns a pointer to the first occurrence of c that is converted to a character in string.
The function returns NULL if the specified character is not found. - 두번째 인자로 주어진 char을 첫번째 인자 c-string에서 탐색하고, 처음으로 발견한 char의 address를 리턴한다
- Ex. HelloNewYear에서 'e'가 처음으로 나오는 인덱스를 알고 싶을 때
- pointer = strchr(string, 'e') -> e는 string의 인덱스 1에 처음으로 존재한다.
리턴값은 첫번째 요소의 주소+1(찾은 인덱스)인 string+1이 된다- 배열의 이름은 늘 첫번째 요소의 주소를 리턴
- 두번째 요소의 주소는 첫번째 요소의 주소 +1
- 거꾸로 이를 이용하면 pointer - string은 string 안에서 'e'가 존재하는 인덱스와 같다.
- pointer = strchr(string, 'e') -> e는 string의 인덱스 1에 처음으로 존재한다.
- Ex. HelloNewYear에서 'e'가 처음으로 나오는 인덱스를 알고 싶을 때
- 단 string에서 c를 찾지 못한다면 리턴값은 NULL이다
'문제풀이' 카테고리의 다른 글
[C언어] 백준 1152 단어의 개수 (0) | 2021.12.22 |
---|---|
[C언어] 백준 1157 단어공부 (0) | 2021.12.22 |
[C언어] 백준 2675 문자열반복 (0) | 2021.12.21 |
[C언어] 백준 11720 (0) | 2021.12.21 |
[C언어] 백준 15596 (0) | 2021.12.20 |