티스토리 뷰
생각
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 |
'알고리즘 > SW Expert' 카테고리의 다른 글
[SW Expert] 6190. 정곤이의 단조 증가하는 수 (0) | 2018.12.15 |
---|---|
[SW Expert] 6718. 희성이의 원근법 (0) | 2018.12.14 |
[SW Expert] 4796. 의석이의 우뚝 선 산 (0) | 2018.10.15 |
[SW Expert] 5213. 진수의 홀수 약수 (0) | 2018.10.14 |
[SW Expert] 5431. 민석이의 과제 체크하기 (0) | 2018.10.14 |
- Total
- Today
- Yesterday