Soal ini sudah pernah saya tulis untuk Porseni VI Imilkom USU 2011. Perbedaannya hanyalah pada output yang diminta.
Diberikan tahun dan interval, tampilkan tahun tersebut beserta tahun-tahun sebelum dan sesudahnya. Untuk tahun yang merupakan tahuun kabisat, tandai dengan tanda bintang/asterisk (*).
Sebagai contoh, diberikan tahun 2011 dan interval 3. Maka tampilkan tahun tersebut (2011) dan 3 tahun setelahnya (2012, 2013, 2014):
2011
2012 *
2013
2014
Jika interval merupakan bilangan negatif, tampilkan tahun-tahun sebelumnya. Sebagai contoh diberikan tahun 2011 dan interval -3, maka:
2011
2010
2009
2008 *
Input:
Input diawali oleh bilangan bulat T (1 <= T <= 1000) yakni banyaknya test case.
T baris berikutnya (di mana setiap baris adalah sebuah test case), terdiri dari dua bilangan bulat Y (1000 <= Y <= 9999) yang merupakan tahun dan N (-1000 <= N <= 1000) yang merupakan interval.
Output:
Untuk setiap test case, tampilkan ‘#’ yang diikuti oleh nomor urut test case (1, 2, 3, …). Selanjutnya tampilkan tahun pada input (Y), tahun-tahun sebelum/setelahnya, serta keterangan kabisat berupa tanda bintang/asterisk (*) untuk tahun yang merupakan tahun kabisat.
Contoh input:
3
2011 3
2011 -3
2011 0
Contoh output:
#1
2011
2012 *
2013
2014
#2
2011
2010
2009
2008 *
#3
2011
———-
Pada soal ini, banyak peserta yang terjebak dengan definisi tahun kabisat. Banyak submission yang diterima judge hanya menyertakan pengujian if (tahun % 4 == 0) untuk pengujian tahun kabisat.
Definisi tahun kabisat yang benar adalah:
Jika tahun HABIS dibagi 100, maka tahun tersebut HARUS habis dibagi 400.
Atau…
Jika tahun TIDAK HABIS dibagi 100, maka tahun tersebut HARUS habis dibagi 4.
Berikut ini merupakan contoh solusi dalam bahasa Java:
import java.util.Scanner;
public class C {
private static boolean isKabisat(int tahun)
{
if (tahun % 100 == 0) {
return (tahun % 400 == 0);
} else {
return (tahun % 4 == 0);
}
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int no = 0;
int nTC = sc.nextInt();
while (nTC-- > 0) {
int Y = sc.nextInt();
int N = sc.nextInt();
System.out.println("#" + ++no);
System.out.println(Y + (isKabisat(Y) ? " *" : ""));
if (N > 0) {
for (int i = 1; i <= N; i++) {
int tahun = Y + i;
System.out.println(tahun + (isKabisat(tahun) ? " *" : ""));
}
} else {
N = Math.abs(N);
for (int i = 1; i <= N; i++) {
int tahun = Y - i;
System.out.println(tahun + (isKabisat(tahun) ? " *" : ""));
}
}
}
}
}
Input dan output yang digunakan juri dapat dilihat di sini.











Komentar Terkini