loading

알고리즘/알고리즘JAVA

[백준알고리즘/문자열] 2941번 문제 : 크로아티아 알파벳(자바/JAVA)

침착곰 2021. 5. 19. 11:45
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 7단계 2941번 문제 크로아티아 알파벳을 풀어봤습니다

이 문제도 그렇게 어렵지 않게 풀었습니다

약간은 노가다만 있을뿐...

답안 제출할 때 StringIndexOutOfBounds 에러만 안나게 잘 프로그래밍을 하면 될 것 같습니다

제가 풀은 방식들을 설명하겠습니다!

 


문제 링크입니다

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

 

2941번: 크로아티아 알파벳

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

www.acmicpc.net

 

문제

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경

č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

 

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

 

출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

 

 


 

 

문제 풀이

첫 번째 방법은 Count에 글자갯수를 입력하고 크로아티아 알파벳과 같은 알파벳이 있다면 Count를 1씩 빼는 방식으로 구현했습니다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 선언 및 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		String str = br.readLine();
		
		// 글자갯수 변수
		int count = str.length();
		int len = str.length();
		
		for(int i = 0; i < len; i++)
		{
			// len - 1인 경우 continue
			if(len - 1 == i)
				continue;
			// 크로아티아 알파벳과 같다면 count--;
			else if(str.charAt(i) == 'c' && str.charAt(i + 1) == '=')
				count--;
			else if(str.charAt(i) == 'c' && str.charAt(i + 1) == '-')
				count--;
			else if(str.charAt(i) == 'd' && str.charAt(i + 1) == '-')
				count--;
			else if(str.charAt(i) == 'l' && str.charAt(i + 1) == 'j')
				count--;
			else if(str.charAt(i) == 'n' && str.charAt(i + 1) == 'j')
				count--;
			else if(str.charAt(i) == 's' && str.charAt(i + 1) == '=')
				count--;
			else if(str.charAt(i) == 'z' && str.charAt(i + 1) == '=')
				count--;
			
			// len - 2인 경우 continue -> 크로아티아 알파벳이 3자리라 -2로 한다
			if(len - 2 == i)
				continue;
			// 크로아티아 알파벳과 같다면 count--;			
			else if(str.charAt(i) == 'd' && str.charAt(i + 1) == 'z' && str.charAt(i + 2) == '=')
				count--;
		}
		
		// 결과 출력
		System.out.print(count);
	}
}

 


두 번째 방법은 count를 0에서 시작 반복문이 돌아갈 때 크로아티아 알파벳과 같은 것이 있다면 i++; 을 해서 count를 패스하는 방법으로 구현했습니다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 선언 및 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		String str = br.readLine();

		// count 및 글자갯수 변수
		int count = 0;
		int len = str.length();
		
		for(int i = 0; i < len; i++)
		{
			char ch = str.charAt(i);
			
			// 'c'인 경우
			if(ch == 'c' && i < len - 1) {
				// 'c=', 'c-' -> i++;
				if(str.charAt(i + 1) == '=' || str.charAt(i + 1) == '-')
					i++;
			}
			// 'd'인 경우
			else if(ch == 'd' && i < len - 1) {
				// 'd-' -> i++
				if(str.charAt(i + 1) == '-')
					i++;
				// 'dz=' -> i += 2;
				else if(str.charAt(i + 1) == 'z' && i < len - 2) {
					if(str.charAt(i + 2) == '=')
						i += 2;
				}
			}
			// 'l'인 경우
			else if(ch == 'l' && i < len - 1) {
				// 'lj' -> i++;
				if(str.charAt(i + 1) == 'j')
					i++;
			}
			// 'n'인 경우
			else if(ch == 'n' && i < len - 1) {
				// 'nj' -> i++;
				if(str.charAt(i + 1) == 'j')
					i++;
			}
			// 's'인 경우
			else if(ch == 's' && i < len - 1) {
				// 's=' -> i++;
				if(str.charAt(i + 1) == '=')
					i++;
			}
			// 'z'인 경우
			else if(ch == 'z' && i < len - 1) {
				// 'z=' -> i++;
				if(str.charAt(i + 1) == '=')
					i++;
			}
			
			count++;
		}
		
		// 결과 출력
		System.out.print(count);
	}
}

 


세 번째 방법은 다른 사람이 푼 걸 참조해서 구현했습니다

출처 : https://www.acmicpc.net/source/28850792

전혀 생각하지 못 했던 방식으로 풀으셨더라고요 ㄷ

크로아티아 알파벳을 String배열로 빼내어 같은게 있다면 replace로 처리해서 알파벳 갯수를 구해줍니다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		// BufferedReader 선언 및 입력
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		String str = br.readLine();
		
		// 크로아티아 문자열 배열 처리
		String[] ca = new String[] { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" };
		
		// 입력한 알파벳에 크로아티아 문자열와 같은 것이 있다면 replace처리
		for(String c: ca) {
			str = str.replace(c, "a");
		}
		
		// 결과 출력
		System.out.print(str.length());
	}
}

 

여기까지 크로아티아 알파벳을 풀은 방법들이었습니다

속도 비교를 해보겠습니다!

 


속도 비교

1번 : count--; 방식

2번 : count++; 방식

3번 : char[]배열 방식

 

1번, 2번, 3번 시간이 동일하게 나올 줄 알았는데 2번 방식이 조금 느리게 나왔네요

메모리 소모는 1번 방식이 제일 적게 나왔습니다

 

이상 백준 알고리즘 2941번 크로아티아 알파벳을 풀은 내용이었습니다

 

다음 문제 : 2021.05.20 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 1316번 문제 : 그룹 단어 체커(자바/JAVA)

이전 문제 : 2021.05.18 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 5622번 문제 : 다이얼(자바/JAVA)

반응형
그리드형