본문 바로가기

programming/알고리즘 풀이

[백준 알고리즘] 2941번 - 크로아티아 알파벳

반응형

1. 문제, 예시 시행결과

 

 이번 문제는 나름 시간이 걸린 문제이다. 문법으로 틀린 문제가 아니라, 논리로 우류가 났기 때문에...... 사실 이런 문제도많이 틀려가면서 스스로 부족한 점을 알아가려는 것에 목적이 있지만, 찾는데 꽤 오랜 시간이 걸렸다...... 결론 부터 말하면 논리 연산자 때문인데, 이 부분을 자세히 설명하는 새로운 글을 쓸 계획이다. 이 글에서는 문제 풀이 만을 설명할 것이다. 다음은 문제 및 예시  실행결과이다.

 

문제: https://www.acmicpc.net/problem/2941

 

2941번: 크로아티아 알파벳

문제 예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s=

www.acmicpc.net


문제 2941번


 이 문제는 다양하게 접근할 수 있을 것이다. 나는 최대한 외부 함수를 사용하지 않고 반목문 만을 사용하기 위해 노력했다. 다음은 예시 실행결과이다.


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. 결어

 

 논리 연산자는 햇갈리는 부분이 많을 것 같다. 아마 완벽하게 이해했다면 햇갈리지 않겠지만...... 어쩌면 완벽하게 알아서 더 햇갈리는 경우도 있을 것 같다. (적어도 내 생각으로는) 논리 연산자에 대한 글을 다른 카테고리에 올릴것이다. 꼭 올렸으면 좋겠다 ㅠㅠ

반응형