2022. 2. 6. 16:32ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/10809
접근 방법 - 배열과 아스키코드를 이용한 수학 문제
백준의 10809번 문제는 배열과 아스키코드를 적절히 사용하여 해결해야 하는 문제이다.
필자는 배열과 아스키코드의 성질을 사용해서 해결한 다른 문제에 대해 글을 작성한 적이 있다.
아래에 해당 글의 링크를 기재해놓으니 함께 참고해보아도 좋을 것이다.
https://smary-it.tistory.com/74
해당 문제는, 입력받은 문자열에 대해 각 문자들이 처음으로 등장한 위치를 출력해야 하는 문제이다.
위 링크의 문제와 다른 점이 있다면, 해당 문제는 문자가 등장한 위치를 저장해야 하는 문제이다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
이러한 문제에 많이 익숙하지 않다면, 3) ~ 4) 과정과 이 부분의 코드를 유심히 보길 바란다.
코드의 실행 순서
1) 문자열을 입력받을 배열(ch)과 각 문자가 등장한 위치를 저장할 배열(a)을 전역 변수로 선언한다.
(이때, a의 배열 크기는 26으로 설정한다.)
2) 단어(ch)를 입력받는다.
3) 문자열 ch를 반복문으로 탐색하며 다음과 같은 연산을 수행한다.
- 탐색한 문자의 아스키코드값에 'a'를 뺀다.
- 위 값을 배열 번호로 같은 a의 배열값이 0인 경우, 반복문의 제어 변수인 i에 1을 더한 값을 해당 배열값으로 저장한다.
(a의 배열값이 0이 아닌 경우엔, 해당 문자가 이미 이전에 한번 등장했다는 뜻이므로 continue문을 사용하였다.)
(여기서 i는 0부터 시작하는데, 전역 변수의 초기값인 0과 혼동되지 않기 위해 i+1을 저장하게끔 하였다.)
4) 모든 연산이 끝났다면, 배열값을 차례로 출력한다. 여기서, 모든 배열값에 1을 뺀 상태로 출력해야 한다.
(출력 예시를 보면, -1은 해당 문자가 등장하지 않은 경우를 뜻하며 그 이상의 값은 각 문자의 위치를 뜻한다. 따라서, 모든 배열값에 1을 뺀 상태로 출력해야 한다.)
5) 실행을 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>
//백준 10809번 코드
char ch[100];
int a[26];
int main() {
scanf("%s", ch);
for (int i = 0; i < strlen(ch); i++) {
if (a[ch[i]-'a'] != 0) { continue; }
a[ch[i] - 'a'] = i + 1;
}
for (int i = 0; i < 26; i++) {
printf("%d ", a[i] - 1);
}
}
제출 결과
(2021.12.18 백준 10809번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 10820번 문자열 분석 (C++/cpp) (0) | 2022.02.09 |
---|---|
[백준 BOJ] 10818번 최소, 최대 (C언어) (0) | 2022.02.06 |
[백준 BOJ] 10808번 알파벳 개수 (C언어) (0) | 2022.02.05 |
[백준 BOJ] 10807번 개수 세기 (C언어) (0) | 2022.02.05 |
[백준 BOJ] 10799번 쇠막대기 (C++/cpp) (0) | 2022.02.05 |