티스토리 뷰

생각

Github - https://github.com/hellojdh/Code/blob/master/src/swexpert/d4/Q5550.java 개구리가 운다. croak.. 크록크록 운다. 예를들어 croakcroak는 1 마리의 개구리가 연이어서 울고있다. croacroakk는 2마리의 개구리가 울고있다. croka 는 croak가 완성될 수 없으므로 -1을 출력한다. 입력이 주어질 때, 몇 마리의 개구리가 울고있는지 출력하여라.


처음 생각

croak의 순서가 중요하므로 각 숫자를 담을 int[5] 배열을 선언해주었다.

▶ c=0, r=1, o=2, a=3, k=4로 생각하였다.


다음 생각

입력으로 받은 문자열을 앞에서 붙어 한 자리씩 보면서 각 배열의 index를 +1 시켜주었다. 이 때, 선행된 문자의 인덱스 값을 -1 시켜주었다. croak는 쭉 이어져있어야 완성되기 때문이다.
▶ c가 들어온다면 arr[0]이 1의 값을 가지고 있으며, r이 들어온다면 arr[0]을 -1 시켜준 후, arr[1]을 +1 시켜준다. 이 때, arr[0]이 마이너스 값으로 들어간다면 순서가 잘못된 것이므로 flag를 false로 바꿔주어 탐색을 종료하고 결과값을 -1로 만들어주었다.


다다음 생각

위의 과정으로 진행을 하면 croak가 완성되면 모든 index의 정보는 0이된다. croak가 완성되면 잉여 개구리의 저장변수 tResult를 +1 시켜주었다.

▶ 맨 처음 c가 들어왔을 때, 잉여 개구리 변수가 0이 아닐경우 전체 개구리수를 증가시켜주지 않는다.


다다다음 생각

여기까지 하면 croak가 진행되는 모든 경우가 판단이 된다. 하지만 마지막 한 가지가 남았다. ccccc 이런식으로 c만 있다면 전체 개구리수는 증가하지만 불가능한 경우이다.

▶ 따라서 위의 과정을 다 돌고 나왔을 때, arr 배열의 값을 검사해서 0이 아닌 값이 있다면 전체 개구리 수를 -1로 바꿔주었다.


방안

1) 앞에서부터 croak를 완성 시키는건 어렵지 않으므로 잉여 개구리 수를 잘 판단해주는게 중요 요소인것 같다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package swexpert.d4;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Q5550 {
    static int[] arr;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int tc = Integer.parseInt(br.readLine());
        for(int i=1;i<=tc;i++) {
            String t = br.readLine();
            int result = 0// 개구리 수
            int tResult = 0// 잉여 개구리 수
            boolean flag = true;
            arr = new int[5]; // c r o a k
            // 각 문자마다 +1을 시켜주고 다음번 문자에서는 전 문자를 -1 시켜준다.
            // k 까지 잘 도착시 tResult(잉여 개구리수)를 +1 시켜준다.
            // c가 처음부터 시작할 때 잉여 개구리수가 있다면 그 개구리로 시작 -> 전체 결과 영향 x
            for(int j=0;j<t.length();j++) {
                switch (t.charAt(j)) {
                case 'c':
                    if(tResult!=0) {
                        tResult--;
                        result--;
                    }
                    result++;
                    arr[0]++;
                    break;
                case 'r':
                    arr[0]--; arr[1]++;
                    if(arr[0]<0) {
                        flag = false;
                        result = -1;
                    }
                    break;
                case 'o':
                    arr[1]--; arr[2]++;
                    if(arr[1]<0) {
                        flag = false;
                        result = -1;
                    }
                    break;
                case 'a':
                    arr[2]--; arr[3]++;
                    if(arr[2]<0) {
                        flag = false;
                        result = -1;
                    }
                    break;
                case 'k':
                    arr[3]--; tResult++;
                    if(arr[3]<0) {
                        flag = false;
                        result = -1;
                    }
                    break;
                }
                if(!flag) break;
            }
            // 개수가 남아 있을 경우 불가능
            for(int j=0;j<5;j++) {
                if(arr[j]!=0) {
                    result=-1;
                    break;
                }
            }
            System.out.println("#"+i+" "+result);
        }
    }
}
 
cs

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday