1. 문제, 예시 시행결과
이번 문제는 나름 시간이 걸린 문제이다. 문법으로 틀린 문제가 아니라, 논리로 우류가 났기 때문에...... 사실 이런 문제도많이 틀려가면서 스스로 부족한 점을 알아가려는 것에 목적이 있지만, 찾는데 꽤 오랜 시간이 걸렸다...... 결론 부터 말하면 논리 연산자 때문인데, 이 부분을 자세히 설명하는 새로운 글을 쓸 계획이다. 이 글에서는 문제 풀이 만을 설명할 것이다. 다음은 문제 및 예시 실행결과이다.
문제: https://www.acmicpc.net/problem/2941
이 문제는 다양하게 접근할 수 있을 것이다. 나는 최대한 외부 함수를 사용하지 않고 반목문 만을 사용하기 위해 노력했다. 다음은 예시 실행결과이다.
여러 방법으로 접근할 수 있겠지만, 나는 글자수를 세는 것에만 집중하였다. 입력되는 문자들을 하나씩 비교하는 방식이다. 비효율 적이라고 생각할 수 있겠지만, 구현은 간단하다고 생각했다. 다음은 풀이 과정이다.
2. 풀이과정
크로아티아 문자를 입력하는 방식을 보면 크게 세가지 부류로 나눌 수 있다. 뒤에 '=' 이 오거나, 'j' 가 오거나 '-'가 오는 문자가 전부이다. 이렇게 마지막 문자를 기준으로 코드를 구현하면, 인덱스의 범위가 넘어가지 않는다는 장점이 생긴다. (물론 앞 인덱스를 초과하지 않게 조치를 취해야 하지만......)
알고리즘은 다음과 같다.
- 문자열의 문자를 for문을 사용하여 하나씩 비교한다.
- for문에 시작에 count변수에 1을 더해준다.
- 만약 문자 중 하나가 =, j, - 중에 하나라면 앞에 문자를 비교한다.
- 앞에 문자도 크로아티아 문자라면 count에서 1을 뺀다. 단 3개짜리 문자는 2를 빼준다.
이것을 전부 논리 연산자로 구현하였는데 그냥 코드가 짧아질 것 같아서 그랬다...... (대가는 아주 컸다 ㅠㅠ) 다음은 나의 코드이다.
#include <stdio.h>
#define SIZE 100
int main(void) {
char input[SIZE];
int count = 0;
scanf("%s", input);
for (int i = 0; input[i]; i++) {
count++;
if (i > 0) {
if ((input[i - 1] == 'c' || input[i - 1] == 's' || input[i - 1] == 'z') && input[i] == '=') {
if (i > 1 && input[i - 2] == 'd' && input[i - 1] == 'z')
count = count - 2;
else
count--;
}
else if ((input[i - 1] == 'c' || input[i - 1] == 'd') && input[i] == '-')
count--;
else if ((input[i - 1] == 'l' || input[i - 1] == 'n') && input[i] == 'j')
count--;
}
}
printf("%d", count);
return 0;
}
3. 결어
논리 연산자는 햇갈리는 부분이 많을 것 같다. 아마 완벽하게 이해했다면 햇갈리지 않겠지만...... 어쩌면 완벽하게 알아서 더 햇갈리는 경우도 있을 것 같다. (적어도 내 생각으로는) 논리 연산자에 대한 글을 다른 카테고리에 올릴것이다. 꼭 올렸으면 좋겠다 ㅠㅠ
'programming > 알고리즘 풀이' 카테고리의 다른 글
[백준 알고리즘] 1929번 - 소수 구하기 (시간 초과, 소수 알고리즘) (0) | 2020.07.25 |
---|---|
[백준 알고리즘] 2292번 - 벌집 (0) | 2020.07.15 |
[백준 알고리즘] 1157번 - 단어공부 (strupr() 함수) (0) | 2020.06.27 |
[백준 알고리즘] 2675번 - 문자열 반복 (0) | 2020.06.27 |
[백준 알고리즘] 10809번 - 알파벳 찾기 (0) | 2020.06.24 |