본문 바로가기

성우리뷰

엘리베이터 숫자 표지판 사칙연산

int ret(int n) {
        if (n == 0) return 6; if (n == 5) return 5;
        if (n == 1) return 2; if (n == 6) return 6;
        if (n == 2) return 5; if (n == 7) return 4;
        if (n == 3) return 5; if (n == 8) return 7;
        if (n == 4) return 4; return 6;
}

int solve(int n) {
        int answer = 0;
        int rem = n;
        int ans = 0; //값
        for (int i = 0; i < 10; i++) {
            rem = n - ret(i); //첫번째 숫자 넣고 남은 횟수
            ans = i; //첫번째 값
            //사칙연산
            for (int j = 0; j < 4; j++) {
                if (j == 0) {
                    rem -= 2;
                    for (int k = 0; k < 10; k++) {
                        rem -= ret(k); //두번째숫자 넣고 남은 횟수
                        ans += k; //첫번째 값+ 두번째값
                        for (int l = 0; l < 10; l++) {
                            //만일 나머지가, 값이 될 수 있는 것과 같고 등식 성립
                            if (rem == ret(l) && ans == l) {
                                answer++;
                            }
                        }

                        rem += ret(k);
                        ans -= k; //원래값 회복
                    }
                    rem += 2;
                }

                if (j == 1) {
                    rem -= 1;
                    for (int k = 0; k < 10; k++) {
                        rem -= ret(k); //두번째숫자 넣고 남은 횟수
                        ans -= k; //첫번째 값+ 두번째값
                        for (int l = 0; l < 10; l++) {
                            //만일 나머지가, 값이 될 수 있는 것과 같고 등식 성립
                            if (rem == ret(l) && ans == l) {
                                answer++;
                            }
                        }

                        rem += ret(k);
                        ans += k; //원래값 회복
                    }
                    rem += 1;
                }

                if (j == 2) {
                    rem -= 1;
                    for (int k = 1; k < 10; k++) {
                        rem -= ret(k); //두번째숫자 넣고 남은 횟수
                        int namuji = ans % k;
                        ans /= k; //첫번째 값 / 두번째값
                        for (int l = 0; l < 10; l++) {
                            //만일 나머지가, 값이 될 수 있는 것과 같고 등식 성립
                            if (rem == ret(l) && ans == l) {
                                answer++;
                            }
                        }

                        rem += ret(k);
                        ans = k * ans + namuji; //원래값 회복
                    }
                    rem += 1;
                }

                if (j == 3) {
                    rem -= 2;
                    for (int k = 0; k < 10; k++) {
                        rem -= ret(k); //두번째숫자 넣고 남은 횟수
                        ans *= k; //첫번째 값+ 두번째값
                        for (int l = 0; l < 10; l++) {
                            //만일 나머지가, 값이 될 수 있는 것과 같고 등식 성립
                            if (rem == ret(l) && ans == l) {
                                answer++;
                            }
                        }

                        rem += ret(k);
                        ans = i; //원래값 회복
                    }
                    rem += 2;
                }
            }
        }

        return answer;
}