PostAddsense


QuipuReader Topcoder



01 public class QuipuReader
02 {
03     public int[] readKnots(String[] knots) {
04         int m = knots.length;
05         int n = knots[0].length();
06
07         boolean[] f = new boolean[50], g = new boolean[50];
08
09         for (int i=0; i < m; i++) {
10             for (int j=0; j < n; j++) {
11                 if(j!=0 && knots[i].charAt(j)=='X' && knots[i].charAt(j-1)=='X') f[j]=true;
12                 if(knots[i].charAt(j)=='X') g[j]=true;
13             }
14         }
15
16         for(int j=0; j < n; j++) if(!g[j]) f[j]=true;
17
18         int[] res = new int[m];
19
20         for (int i=0; i < m; i++) {
21             for (int j=0; j < n; j++) {
22                 if(!f[j]) res[i] *= 10;
23                 if(knots[i].charAt(j) == 'X') res[i] += 1;
24             }
25         }
26
27         return res;
28     }
29 }


Explanation

09번 for문은 주어진 문장이 두 개의 연속된 'X'를 가질 경우와 한 개의 'X'를 가질 경우를 각각 boolean배열에 표시한다. 두 가지로 나눈 이유는 두 개 이상의 연속된 'X'들 중 제일 첫 번째 'X'에 false를 설정해 22번에 결과값에 10씩 곱하기 위해서이다. 단일 'X'는 따로 표시할 수가 없으므로 따로 boolean 배열에 표시해둔다. 그리고 16번 for문을 이용해 false인 자리가 있다면 f배열에 true로 설정해 단일 'X'를 표시한다. 단일 'X' 앞은 항상 false이기 때문에 22번 조건식을 건너뛰어 10을 곱하지 않고 그대로 res[i]에 1을 저장한다.


References