На первый взгляд проблема кажется сложной - алгоритм для трехсменного расписания, но когда вы понимаете, что сдвиги представляют собой некоторые закономерности и эти закономерности не меняются во времени, проблема начинает выглядеть очень легко.
Идея "Сохраняет первый месяц в массиве, и когда мне понадобится определенный день. Я могу посчитать его за циклы" решит проблему.Я хочу добавить, что не обязательно использовать циклы .Шаблон смены повторяется каждые 16 дней - значения для 11 и 27 января одинаковы.
Для определенного дня d вы можете рассчитать сдвиг для каждой бригады, используя следующий псевдокод:
D = The distance between a particular day d and January 1st in days.
A = Schedule for January 2019. A zero indexed array with 4 rows and 31 columns.
S1=A[1][D mod 16] will be the calculated shift number for brigade 1 at day d.
S2=A[2][D mod 16] will be the calculated shift number for brigade 2 at day d.
...
S4=A[4][D mod 16] will be the calculated shift number for brigade 4 at day d.
Знание S1, S2, S3 и S4 достаточно, чтобы getBrigadeNumber
вернул правильное значение.