나의 풀이
#include <stdio.h>
#include <string.h>
int main(void) {
int c, index = 0, arr[26]; //arr : 정답을 저장해 줄 배열
memset(arr, -1, sizeof(arr)); //배열 -1로 초기화
while ((c = getchar()) != '\n') { //개행 전까지 단어 한 글자씩 비교
if (arr[c - 97] == -1) { //해당 알파벳이면 인덱스값을 배열에 넣기
arr[c - 97] = index;
}
index++;
}
for (int i = 0; i < 26; i++) {
printf("%d ", arr[i]);
}
return 0;
}
memset()은 string.h에 들어있는 함수다.
메모리를 초기화할 때 편하다.
단순히 0으로 초기화할 때는 arr[26]={0}으로 해주어도 되지만,
-1 또는 1로 초기화하고 싶을 때 아래와 같이 활용한다.
int arr1[26];
memset(arr,-1,sizeof(arr)); //memset(초기화할 주소,초기값,크기)
char arr2[26];
memset(arr,1,sizeof(arr));
getchar()는 글자를 하나씩 가져오는 함수이다.
scanf()로 단어 자체를 가져와서 비교하는 방법도 있었을 테지만...
요새 getchar()를 쓸 일이 많아서 그냥 이걸로 썼다.
특정 글자(\0, \n 등)가 나왔을 때까지 계속 스캔하는 용도로 쓰면 매우 편하다.
참고로 scanf에서도 가능한 기능이긴 하다.
줄바꿈 전까지 무조건 입력하고 싶을 때는 scanf("%[^\n]s, s) 요런 식으로,
^ 전에 줄바꿈문자를 넣으면 된다. 줄바꿈문자 말고 다른 문자도 가능하니 참고해두면 좋다!
arr[c-97]은...맨 처음에 배열 선언할 때 알파벳 기준으로 선언했기 때문에 나온 코드이다.
int arr[26]은 A~Z까지 입력여부 및 인덱스를 저장할 배열이다.
getchar로 가져온 char에서 소문자 a의 아스키 코드인 97을 빼주면
arr[0]~arr[26]까지 예쁘게 입력 가능하다.
예를 들면 c=getchar()로 b를 가져왔을 때, b(아스키코드 98)-97=1이기 때문에
arr[1]에 b의 인덱스를 저장할 수 있는 것이다!
간편한 점은 맨 처음에 memset을 이용해 배열을 -1로 초기화해주었기 때문에
맨 마지막에서 배열 출력 시 if문 등으로 값이 있는지 없는지 계산할 필요 없이
바로 출력하면 된다는 것이다.
생각해 보니 이렇게 하면 무조건 26*4byte에 대해 메모리를 잡아먹으므로...
테스트케이스에 따라 다르겠지만 다른 분들처럼 문자열을 배열로 가져와서 비교하는 것이 더 효율적일지는
고민해볼 문제이다.
'프로그래밍 > 백준' 카테고리의 다른 글
[백준 C언어] 3052. 나머지 (0) | 2022.12.21 |
---|---|
[백준 C언어] 2908. 상수 (2) | 2022.12.21 |
[백준] 1292. 쉽게 푸는 문제 (0) | 2022.11.15 |
[백준] 1978. 소수 찾기 (0) | 2022.11.15 |
[백준] 2693. N번째 큰 수 (0) | 2022.11.15 |