본문 바로가기
알고리즘/백준

2941번 문제 : 크로아티아 알파벳

by son_i 2023. 4. 26.
728x90

2941번: 크로아티아 알파벳 (acmicpc.net)

 

2941번: 크로아티아 알파벳

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

www.acmicpc.net

간단하게 풀었다고 생각하는데 40분이나 걸렸다.

내가 아는 지식 수준으로는 문자열을 substring으로 각각 두 글자 세 글자 잘라서 배열 안에 목록을 넣어놓고 비교했는데

contains라는 좋은 메소드를 알게되었다 !

 

기존 내가 만든 코드

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MulticastSocket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

class Main{
	public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    	String str = br.readLine();
    	String arr[] = {"c=","c-","dz=","d-","lj","nj","s=","z="};
    	
    	int count =0;
   
    	while(str.length() >0){
    		boolean ch = false;
    		String alpha ="";
    		String beta = "";
    		if(str.length()>=2)
    			alpha = str.substring(0,2);
    		if(str.length()>=3)
    			beta = str.substring(0,3);
    		for(int j=0;j<arr.length;j++) {
    			if(alpha.equals(arr[j])) {
    				count++;
    				str = str.substring(2);
    				ch=true;
    			}
    			else if(beta.equals(arr[j])) {
    				count++;
    				str = str.substring(3);
    				ch=true;
    			}
    		}
    			if(ch == false) { //배열에 저장된 크로아티아 알파벳이 아니라면
    				count++;
    				str = str.substring(1);
    			}
    	}
    	System.out.println(count);
	}
}

 

contains를 이용해 새로구성한 코드

package algorithm;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MulticastSocket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

class Main{
	public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    	String str = br.readLine();
    	String arr[] = {"c=","c-","dz=","d-","lj","nj","s=","z="};
    	
    	int count =0;
   
    	for(int i=0;i<arr.length;i++) {
    		if(str.contains(arr[i])) {
    			str = str.replace(arr[i],"*");
    		}
    	}
    	System.out.println(str.length());
	}
}

 시간은 비슷하지만 정말 간단해졌따 코드가 

근데 신기한게 z=z= 같이 배열 요소 마지막에서 이 문자열을 한 번 잡아서 *로 바꿨을 거 아냐 ? 그럼 반복이 끝나는데 어떻게 두 개를 캐치한 걸까 ? 근데 이거 쓰면서 생각이 났는데 replace가 arr[i] (z=)이 있는 모든 구간을 찾아 *로 변환시켜주는 거 같다!