技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

leetCode:299. Bulls and Cows

leetCodeの「299. Bulls and Cows」を解いた。
https://leetcode.com/problems/bulls-and-cows/

なかなかリーダブルなコードが書けたので、今後参考にするために、書いたコードをここに残しておく。

class Solution {
    public String getHint(String secret, String guess) {
        int bull = 0;
        int cow = 0;
        Map<Character, Integer> secretDigitToCnt = new HashMap<>();
        Map<Character, Integer> guessDigitToCnt = new HashMap<>();

        for (int i = 0; i < secret.length(); i++) {
            if (secret.charAt(i) == guess.charAt(i)) {
                bull++;
            }
            else {
                secretDigitToCnt.put(secret.charAt(i),
                        secretDigitToCnt.getOrDefault(secret.charAt(i), 0) + 1);
                guessDigitToCnt.put(guess.charAt(i),
                        guessDigitToCnt.getOrDefault(guess.charAt(i), 0) + 1);
            }
        }

        // secretDigitToCnt や guessDigitToCnt の key (char型) には、'0', '1', ... , '9' (に対応した数値) が入っている。
        // 具体的には、'0'=48, '1'=49, ... , '9'=57 といった感じ。
        for (char ch = '0'; ch <= '9'; ch++) {
            if (secretDigitToCnt.get(ch) != null && guessDigitToCnt.get(ch) != null) {
                cow += Math.min(secretDigitToCnt.get(ch), guessDigitToCnt.get(ch));
            }
        }

        StringBuilder ans = new StringBuilder();
        ans.append(bull).append('A').append(cow).append('B');
        return ans.toString();
    }
}