Ako každý rok, aj v roku 2022 Národné toaletné centrum zorganizovalo
Zraz toaletárov. Pre veľkú popularitu tohto podujatia sa organizátori
rozhodli obmedziť vstup verejnosti. Aby však nerozhnevali verných
nadšencov Zrazu toaletárov, vymysleli súťaž, ktorá by umožnila tým
najbystrejším zúčastniť sa.
Filip, obrovský fanúšik porcelánových trónov, však veľmi bystrý nie je a
žiada ťa aby si mu pomohol dostať sa na tohtoročný Zraz toaletárov.
IT oddelenie Národného toaletného centra vymyslelo takúto šifru: Dostaneme dve čísla $n$ a $k$ a text rozdelený na riadky, obsahujúci iba alfanumerické znaky a medzery. Aby sme Filipa dostali na Zraz toaletárov musíme šifru rozlúštiť. To urobíme následovne: Pre každý z riadkov vypíšeme $k$-ty znak riadku, pričom sa medzery nepočítajú ako znak. Môže sa stať, že v riadku bude nedostatočný počet znakov – vtedy vypíšeme prázdny riadok.
Na prvom riadku vstupu sú dve medzerou oddelené čísla: $n$ - počet riadkov textu a $k$ - index znaku, ktorý nás zaujíma (je šifrou). Ďalej na vstupe nasleduje $n$ riadkov textu.
Na každý z $n$ riadkov vypíšete buď znak, ktorý je šifrou alebo prázdny riadok.
Sú 4 sady vstupov. Pre prvé tri sady platia tieto obmedzenia:
| Sada | 1 | 2 | 3 |
|---|---|---|---|
| $1 \leq n \leq$ | $50$ | $1\,000$ | $10\,000$ |
| $1 \leq k \leq$ | $100$ | $500$ | $10\,000$ |
Štvrtá sada zahŕňa špeciálne prípady.
Input:
2 5
Narodne toaletne centrum
9800 navstevnikov
Output:
n
a
Všimnime si, že číslujeme od nuly, teda $k$ je naozaj indexom.
Input:
3 2
Ako
sa
mas
Output:
o
s
Druhý riadok nemal dostatočný počet znakov, teda sme vypísali prázdny riadok.
Našou úlohou bolo prejsť každý riadok vstupu a vypísať z neho $k$-te písmeno. Bolo treba ignorovať medzery, a ak bol riadok bez medzier kratší ako naše $k$, vypísať prázdny riadok.
Mohli sme zvoliť viacero postupov. Tým najprimitívnejším bolo prechádzať každý znak z riadku, zapamätať si koľko nemedzerových znakov sme už prešli, a keď sa tento počet rovnal $k$, vypísať aktuálny znak. Ak sme sa dostali na koniec riadku a naše počítadlo bolo menšie ako $k$, vypíšeme prázdny riadok. Mohli sme taktiež využiť vstavané funkcie na nahradenie znakov medzery v riadku “ničím” a skontrolovať, či je riadok dlhší ako $k$. Ak áno vypísať jeho $k$-ty znak.
Časová zložitosť riešenia je $O(n \cdot k)$. Pamäťová zložitosť je priamo úmerná dĺžke riadku($l$), teda $O(l)$.
numberOfLines,k=map(int, input().split())
out = ''
for i in range(numberOfLines):
data = input()
data = data.replace(' ', '')
if len(data)>k:
print(data[k])
else: print()
//
// Created by filip on 5/12/22.
//
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
void kCharacter() {
string input;
int numberOfLines = 0;
int k = 0;
cin >> numberOfLines >> k;
getline(cin, input);
for (int j = 0; j < numberOfLines; j++) {
getline(cin, input);
int c = -1;
for (int i = 0; i < input.length(); ++i) {
if (input[i] != ' ') {
c++;
}
if (c == k) {
cout << input[i];
break;
}
}
cout << endl;
}
}
int main() {
kCharacter();
}
Korešpondenčný seminár z programovania zastrešuje občianske združenie Trojsten.
Trojsten, o.z.
FMFI UK, Mlynská dolina
842 48 Bratislava
Programátorská súťaž pre základoškolákov
Materiály a úlohy na výučbu programovania
Intenzívny programátorský zážitok v lete