PostAddsense


Masterbrain Topcoder



public class Masterbrain
{
    String score(String g, String p) {
        int b = 0, w = 0;
        boolean[] ug = new boolean[4];
        boolean[] up = new boolean[4];

        for (int i = 0; i < 4; i++) {
            if (g.charAt(i)==p.charAt(i)) {
                b++;
                ug[i] = true;
                up[i] = true;
            }
        }

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (!ug[i] && !up[j] && g.charAt(i)==p.charAt(j)) {
                    w++;
                    ug[i] = true;
                    up[j] = true;
                }
            }
        }

        return "" + b + "b " + w + "w";
    }

    boolean check(String[] g, String[] r, String p) {
        int lies = 0;
        for (int i = 0; i < g.length; i++) {
            String res = score(g[i],p);
            if (!r[i].equals(res)) {
                if (lies == 1) return false;
                else lies = 1;
            }
        }
        return lies == 1;
    }

    public int possibleSecrets(String[] guesses, String[] results) {
        int res = 0;
        char[] p = new char[4];
        for (p[0] = '1'; p[0] <= '7'; p[0]++)
        for (p[1] = '1'; p[1] <= '7'; p[1]++)
        for (p[2] = '1'; p[2] <= '7'; p[2]++)
        for (p[3] = '1'; p[3] <= '7'; p[3]++)
            if (check(guesses, results, new String(p)))
                res++;

        return res;
    }
}


Problem

각 자리마다 1~7의 숫자를 가질 수 있는 4자리가 있다. 두 명의 사람 중 한 사람은 숫자 4자리가 정하고 나머지 한 사람은 이 숫자를 추측해야 한다. b는 해당 자리와 숫자가 정확히 일치하는 개수고, w는 숫자는 같지만 자리가 다른 개수이다. 한 가지 예외는 추측한 숫자에 대한 답 중 정확히 한 개는 거짓이여야 한다는 것이다. 


Explanation

1111~7777 숫자를 만드는 4개의 for문으로 특정 숫자를 만든다. 이 숫자를 guesses배열에 있는 숫자들과 비교한다. 이 결과로 나온 String "xb xw"를 results배열과 비교하고 같은 결과값인 개수에 따라 계수(counting) 유무를 정한다. 2개 이상이면 제외하고, 1개는 계수(count)에 포함시키고 0개면 제외한다.


References