#include <stdio.h>
#include <string.h>
int main()
{
char S[100];
int result[26];
scanf("%s", S);
for (int j = 0; j < 26; j++)
result[j] = -1;
for (int i = 0; i < strlen(S); i++)
{
for (char j = 'a'; j <= 'z'; j++)
{
if (S[i] == j)
{
if (result[j - 97] != -1)
break;
result[j - 97] = i;
break;
}
}
}
for (int i = 0; i < 26; i++)
printf("%d ", result[i]);
printf("\n");
}
이렇게 되면 시간복잡도가 최대로 N*26이 되게 된다. 그래서 아래와 같이 짠 경우가 더 좋다고 생각한다.
#include <stdio.h>
int main()
{
char n[101], alpha[26];
scanf("%s", n);
for (int i = 0; i < 26; i++)
alpha[i] = -1;
for (int i = 0; n[i]; i++)
{
if (alpha[n[i] - 'a'] == -1)
alpha[n[i] - 'a'] = i;
}
for (int i = 0; i < 26; i++)
{
printf("%d ", alpha[i]);
}
}
백준 mofoco님의 코드이다. 여기서
for (int i = 0; n[i]; i++)
{
if (alpha[n[i] - 'a'] == -1)
alpha[n[i] - 'a'] = i;
}
이게 왜 가능하지 생각했는데
문자열에서는 마지막에 NULL이 담긴다는 사실을 잊고 있었다.
그래서 if(a)
의 경우 a != 0
인 것처럼,
n[i]
의 경우에도 for문 안에서 있으므로 n[i] != 0
즉 n[i]가 0이 아닐 동안
동작한다고 이해할 수 있다.!
또
if (alpha[n[i] - 'a'] == -1)
alpha[n[i] - 'a'] = i;
이 부분은 이미 -1로 채워진 배열을 정하고 -1이 아닐 때 값을 넣었다.
나와의 다른 점은 나는 -1이 아닐 때 a부터 z까지 돌리다가 break 했지만
이 분은 - 'a'
를 해서 그 값을 이용했다.
#include <stdio.h>
#include <string.h>
int main()
{
char S[100];
int result[26];
scanf("%s", S);
for (int j = 0; j < 26; j++)
result[j] = -1;
for (int i = 0; i < strlen(S); i++)
{
if (result[S[i] - 'a'] == -1)
{
result[S[i] - 'a'] = i; // S[i] - 'a'는 알파벳의 순서
}
}
for (int i = 0; i < 26; i++)
printf("%d ", result[i]);
printf("\n");
}
그냥 처음부터 연산을 해서 넣을 수도 있다.
#include <stdio.h>
#include <string.h>
int main() {
char s[100];
int alphabet[26], len, index;
for (int i = 0; i < 26; i++) {
alphabet[i] = -1;
}
scanf("%s", s);
len = strlen(s);
for (int i = 0; i < len; i++) {
index = s[i] - 'a';
if (alphabet[index] == -1) {
alphabet[index] = i;
}
else {
continue;
}
}
for (int i = 0; i < 26; i++) {
printf("%d ", alphabet[i]);
}
return 0;
}
변수명을 이렇게 두면 훨씬 이해하기 편할 것이라고 생각한다.
새로운 점을 또 배웠다.