본문 바로가기

건승하고있어요/알고리즘

[문자열사용하기] 크로아티아 알파벳

반응형

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

크로아티아 알파벳변경
čc=
ćc-
dz=
ñd-
ljlj
njnj
šs=
žz=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다. 입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

(출처:https://www.acmicpc.net/problem/29410)


음...

또 굉장히 직관적으로 풀었다.

String을 활용해서 풀다보니 뭔가 굉장히 느려졌고, 또 그 String에 해당하는 변수를 일일이 하나씩 만들어서 풀다보니 역시 많이 느려졌다. 하지만 딱히 코드가 남들보다 월등히 길다거나 남들보다 엄청 느린건 아니어서 어떻게 하는게 정답인지는 잘 모르겠지만, 다른 정답이 있을텐데 또 찾아보기는 귀찮은 이 게으름 ㅋㅋㅋ


문자가 2개 이상 나열된 애들을 어떻게 하나로 인식할까 고민하다가 String메소드에 있던 replace를 활용하는게 빠르겠다고 생각이 들었다.

하지만 알다시피 String은 그 안의 내용이 변하는게 아니라 그냥 잠시동안 꺼내서 그걸 바꿔서 보여주는 것이어서 선언된  String자체가 변하지는 않는다. 그래서 계단식으로 바뀐 내용을 다시 새로운 str로 선언하고, 또 그 선언한거에서 replace해서 새롭게 또 다른 string을 만들고 해야했다. 


  //c= ->1
  String a = voca.replaceAll("c=""1");


"c-"라는 글자를 발견했을 때 숫자 1로 바꿔줬다. 왜 숫자 1로 바꿨냐 함은 그냥... 글자 1개로 바꿔주려고

어차피 글자 수를 세는게 전부이기 때문에 2개의 문자로 이루어진 글자를 1개로만 바꿔주면 된다고 생각했다.

그렇게 모든 글자를  한개의 숫자로 바꾸고 나서 총 숫자가 몇개 있는지 세어보면 되니까

        System.out.println(h.length());

그래서 마지막은 가장 마지막으로 선언된 string의 길이를 출력하는 것으로 끝난다.


분명 다른 좋은 방법이 있을텐데...

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

고민하다가 또 원초적인 방법으로 풀고 말았따 어허이..


------------------------------------------------------------------------------------------

포문을 돌리면 된다!

새롭게 String을 만들지 않고 그 변수를 그대로 받아서 새롭게 갱신해 주면 되는거였는데!!


1
2
3
4
5
6
7
String croatia [] = {"c=","c-","dz=","d-","lj","nj","s=","z="};
        
        for(int i=0; i<8 ;i++) {
            voca = voca.replace(croatia[i], "1");
        }
        System.out.println(voca.length());
        
cs


우선 해당되는 크로아티아 문자 변형들을 string배열로 각각 넣어준다.

그 다음 포문을 돌려서 순서대로 바꿔주면 끝나는 문제였는뎅...

핫핫항!!!!!!!!




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Scanner;
 
public class Croatia {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String voca = scan.nextLine();
    
        //c= ->1
        String a = voca.replaceAll("c=""1");
        //c- ->2
        String b = a.replaceAll("c-""2");
        //dz= ->3
        String c = b.replaceAll("dz=""3");
        //d- ->4
        String d = c.replaceAll("d-""4");
        //lj ->5
        String e = d.replaceAll("lj""5");
        //nj ->6
        String f = e.replaceAll("nj""6");
        //s= ->7
        String g = f.replaceAll("s=""7");
        //z= ->8
        String h = g.replaceAll("z=""8");
        
        System.out.println(h.length());
 
        scan.close();
    }
 
}
 
cs


반응형