Чтобы решить любую проблему, не обязательно быть суперумным. Вам просто нужно 1) уметь разбивать проблемы на подпроблемы, 2) быть немного умнее самой сложной из атомарных подпроблем. Настоящая сложность заключается в том, что этот процесс может занять очень много времени.