E. Кашееды — 2

Изменим задачу и напишем программу, которая поможет быстро выяснить, сколько детей любят только одну кашу.

Формат ввода

В первых двух строках указывается количество детей, любящих манную и овсяную каши (N и M).
Затем идут N+M строк — перемешанные фамилии детей.
Гарантируется, что в группе нет однофамильцев.

Формат вывода:

Количество учеников, которые любят только одну кашу.
Если таких не окажется, в строке вывода нужно написать «Таких нет».

Пример

Ввод

3
2
Васильев
Петров
Васечкин
Иванов
Михайлов

Вывод

5

Ввод

3
3
Иванов
Петров
Васечкин
Иванов
Петров
Васечкин

Вывод

Таких нет

Решение

Основная трудность заключается в том, что списки без особого предупреждения становятся ПЕРЕМЕШАННЫМИ. Это означает, что пример два мог бы выглядеть совсем по-другому:

3
3
Иванов
Иванов
Петров
Петров
Васечкин
Васечкин

Это значит, что нам надо придумать механизм фильтрации детей по двум спискам, или какой-то другой способ решить задачу. Рассмотрим три варианта.

Фильтрация фамилий.
Заводим два множества, считываем фамилии, и если фамилия уже есть в первом списке, то записываем ее во второй.
Остается найти разницу двух списков и мы получим ответ.

Метод словаря.
Заводим словарь. Если фамилия есть в словаре, увеличиваем содержимое ячейки словаря, в противном случае добавляем ее в словарь со значением 1.
Считаем количество фамилий со значением 1 и выводим в качестве ответа.

Метод одного множества.
Этот метод основан на предположении, что одна и та же фамилия не может встретиться больше чем два раза, в противном случае метод не сработает.
Заводим множество, читаем фамилии. Если фамилии нет в множестве, добавляем ее, если есть – удаляем. Ответ – размер оставшегося множества.

Посмотреть код

Решение

Python
# Фильтрация фамилий

list1size = int(input())
list2size = int(input())

list1 = set()
list2 = set()

for _ in range(list1size + list2size):
    name = input()
    if name in list1:
        list2.add(name)
    else:
        list1.add(name)

# print(list1, list2)

if len(junction := (list1 ^ list2)) != 0:
    print(len(junction))
else:
    print('Таких нет')

Решение

Python
# Метод словаря

list1size = int(input())
list2size = int(input())

porridge_eaters = {}

for _ in range(list1size + list2size):
    eater = input()
    porridge_eaters[eater] = porridge_eaters.get(eater, 0) + 1

one_porridge_lovers = []

for eater in porridge_eaters:
    if porridge_eaters[eater] == 1:
        one_porridge_lovers.append(eater)

if len(one_porridge_lovers) != 0:
    print(len(one_porridge_lovers))
else:
    print('Таких нет')

Решение

Python
# Метод одного множества

list1size = int(input())
list2size = int(input())

porridge_eaters = set()

for _ in range(list1size + list2size):
    eater = input()
    if eater in porridge_eaters:
        porridge_eaters.remove(eater)
    else:
        porridge_eaters.add(eater)

if porridge_eaters:
    print(len(porridge_eaters))
else:
    print('Таких нет')
Подписаться
Уведомить о
guest
3 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Ivan
Ivan
22.07.2024 21:47

Можно чуть короче

m = int(input())
o = int(input())
al = set()

for _ in range(m + o):
    al.add(input())
result = abs(m + o – (len(al) * 2))
if result > 0:
    print(result) 
else:
    print(‘Таких нет’) 

Последний раз редактировалось 5 месяцев назад Ivan ем
Ivan
Ivan
Ответить на  Сергей Клочко
23.07.2024 12:13

С этим соглашусь, сам потом минут пять пытался вникнуть, почему это решение работает