백준 10809 C

줍줍·2023년 4월 9일
0

백준

목록 보기
4/7
post-thumbnail

나의 코드


#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] != 0n[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;
}

변수명을 이렇게 두면 훨씬 이해하기 편할 것이라고 생각한다.
새로운 점을 또 배웠다.

profile
쉽게 설명하지 못하면 이해 못한 것

0개의 댓글