본문 바로가기

백준 문제 정리

백준 10809 알파벳 찾기 (C 언어)

문제 링크: https://www.acmicpc.net/problem/10809

 

10809번: 알파벳 찾기

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

www.acmicpc.net

 

1. 이 문제에 접근하기 위해 필요한것

  • 아스키코드 사용
  • 주어진 배열의 0이 아닌 다른 수로 초기화 방법
  • strlen 함수사용

2. 이 문제에 접근할때 처음에 틀렸었는데 틀린 코드를 제시하겠다.

#include <stdio.h>
#include <string.h>

int main(void) {

  char a[101];
  int alpa[26];

  for(int i=0 ; i<26 ; i++)
  {
    alpa[i] = -1 ; 
  }

  scanf("%s",a);

  int len = strlen(a);

  for(int i=0 ; i<len ; i++)
  {
    int temp = a[i]-97;    
    for(int j=0 ; j<26 ; j++)
    {
      if(j==temp) 
      {
        alpa[j]=i; 
		// 알파벳이 반복되어 나올때 가장 마지막 수의 위치가 출력되어
		// 주어진 조건에 위배된다.(조건: 처음음 등장하는 위치를 공백으로 구분해서 출력한다.) 
      }
    }
  }

  for(int i=0 ; i<26 ; i++)
  {
    printf("%d ",alpa[i]);
  }
 
  return 0;
}

 

3. 수정된풀이(정답코드)

#include <stdio.h>
#include <string.h>

int main(void) {

  char a[101];
  int alpa[26]; // 알파벳 26개

	// 배열 alpa를 -1로 모두 초기화
  for(int i=0 ; i<26 ; i++)
  {
    alpa[i] = -1 ; 
  }

  scanf("%s",a);

	// 배열의 길이 구하는 함수 strlen
  int len = strlen(a);

	// for문 이용
  for(int i=0 ; i<len ; i++)
  {
    int temp = a[i]-97;
		// 입력된 소문자의 아스키코드에 -97을 빼면
		// temp는 alpa의 index값이 저장된다고 생각하면된다.    
    
		if(alpa[temp]==-1)
		// 위에서 모든 alpa 값 -1로 초기화 했으니..
		// 이 조건 덕분에 중복 문자가 나오더라도
		// 첫번째 문자 위치만 출력됨!
		{
			alpa[temp] = i; // i는 입력된 문자의 index값(위치)이다.
			 
		}
	
  }

  for(int i=0 ; i<26 ; i++)
  {
    printf("%d ",alpa[i]);
  }

  
  return 0;
}

<느낀점>

  1. 조금 생각이 필요한 문제였다.