Рискну ответить, хотя вопрос на самом деле не простой, т к у всех всё очень индивидуально. Вам стоит не просто решать задачи одну за одной, а начать усложнять их самостоятельно. Как это работает: вы придумываете дополнительные условия, а ваш мозг сам подсказывает как это можно реализовать. Т к придумали вы это сами, мозг может уже изначально знать решение на подсознательном уровне. Дальнейшая реализация решения в коде закрепляет навык. Вы начинаете как бы представлять как работает код внутри.
Другие варианты действий:
1. Разбор чужих решений до полного понимания их работы. Берете и буквально на бумаге расписываете всё, что происходит на каждой итерации цикла - все переменные и как сработают условия. Эта техника развивает не только внутреннее представление работы кода, но и навык чтения чужого кода.
2. Более простой метод: тоже самоме, что и п1, но с использованием отладчика. На каждой итерации цикла смотрите состояние программы и у вас должны появиться мысли, что и куда нужно там добавить, что бы получить нужный эффект. Это "упражнение" за одно развивает навык отладки.
3. Не зацикливайтесь на конечном правильном решении, разбивайте задачу на малые итерации. Из вашего же примера: не можете сообразить как получить второе значение, выведите первое! Затем прогоните программу через отладчик (ну или "через бумажку") и попробуйте понять чего не хватает и где.