안녕하세요
백준 알고리즘 단계별로 풀어보기 7단계 2941번 문제 크로아티아 알파벳을 풀어봤습니다
이 문제도 그렇게 어렵지 않게 풀었습니다
약간은 노가다만 있을뿐...
답안 제출할 때 StringIndexOutOfBounds 에러만 안나게 잘 프로그래밍을 하면 될 것 같습니다
제가 풀은 방식들을 설명하겠습니다!
문제 링크입니다
https://www.acmicpc.net/problem/2941
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳변경
č | c= |
ć | c- |
dž | 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)
'알고리즘 > 알고리즘JAVA' 카테고리의 다른 글
[백준알고리즘/기본 수학 1단계] 1712번 문제 : 손익분기점(자바/JAVA) (0) | 2021.05.22 |
---|---|
[백준알고리즘/문자열] 1316번 문제 : 그룹 단어 체커(자바/JAVA) (0) | 2021.05.20 |
[백준알고리즘/문자열] 5622번 문제 : 다이얼(자바/JAVA) (0) | 2021.05.18 |
[백준알고리즘/문자열] 2908번 문제 : 상수(자바/JAVA) (0) | 2021.05.17 |
[백준알고리즘/문자열] 1157번 문제 : 단어 공부(자바/JAVA) (0) | 2021.05.16 |