fork download
  1. // Soal 2
  2. // By Taufiq Hidayatullah
  3.  
  4. /**
  5.  * Class untuk mencatat dan mengelola klasemen poin klub sepak bola.
  6.  * @param {string[]} clubs - Array berisi nama-nama klub yang berpartisipasi.
  7.  */
  8. class Klasemen {
  9. constructor(clubs = []) {
  10. this.points = {};
  11. clubs.forEach(club => {
  12. // Menghapus spasi ekstra dari nama klub jika ada
  13. const trimmedClub = club.trim();
  14. if (trimmedClub) {
  15. this.points[trimmedClub] = 0;
  16. }
  17. });
  18. }
  19.  
  20. /**
  21.   * Mencatat hasil satu pertandingan dan memperbarui poin klub.
  22.   * @param {string} klubKandang - Nama klub tuan rumah.
  23.   * @param {string} klubTandang - Nama klub tamu.
  24.   * @param {string} skor - Skor pertandingan dalam format "skorKandang:skorTandang".
  25.   */
  26. catatPermainan(klubKandang, klubTandang, skor) {
  27. const [skorKandang, skorTandang] = skor.split(':').map(Number);
  28. if (skorKandang > skorTandang) {
  29. this.points[klubKandang] += 3;
  30. } else if (skorTandang > skorKandang) {
  31. this.points[klubTandang] += 3;
  32. } else {
  33. this.points[klubKandang] += 1;
  34. this.points[klubTandang] += 1;
  35. }
  36. }
  37.  
  38. /**
  39.   * Mengembalikan daftar klub yang sudah diurutkan berdasarkan poin tertinggi.
  40.   * @returns {string[]} - Array nama klub terurut.
  41.   */
  42. _getSortedKlasemen() {
  43. return Object.keys(this.points).sort((a, b) => this.points[b] - this.points[a]);
  44. }
  45.  
  46. /**
  47.   * Mencetak klasemen akhir yang terurut berdasarkan poin.
  48.   * @returns {Object} - Object yang berisi nama klub dan poinnya.
  49.   */
  50. cetakKlasemen() {
  51. const sortedClubs = this._getSortedKlasemen();
  52. const result = {};
  53. sortedClubs.forEach(club => {
  54. result[club] = this.points[club];
  55. });
  56. return result;
  57. }
  58.  
  59. /**
  60.   * Mengambil nama klub pada peringkat tertentu.
  61.   * @param {number} nomorPeringkat - Peringkat yang ingin dicari (dimulai dari 1).
  62.   * @returns {string} - Nama klub pada peringkat tersebut.
  63.   */
  64. ambilPeringkat(nomorPeringkat) {
  65. const sortedClubs = this._getSortedKlasemen();
  66. if (nomorPeringkat > 0 && nomorPeringkat <= sortedClubs.length) {
  67. return sortedClubs[nomorPeringkat - 1];
  68. }
  69. return "Peringkat tidak valid";
  70. }
  71. }
  72.  
  73. let inputData = '';
  74. process.stdin.on('data', (chunk) => {
  75. inputData += chunk;
  76. });
  77.  
  78. process.stdin.on('end', () => {
  79. const lines = inputData.trim().split('\n');
  80.  
  81. const peringkatToFind = parseInt(lines.pop(), 10);
  82. const clubList = lines.shift().split(',');
  83.  
  84. const klasemen = new Klasemen(clubList);
  85.  
  86. lines.forEach(line => {
  87. const [klubKandang, klubTandang, skor] = line.split(',');
  88. if (klubKandang && klubTandang && skor) {
  89. klasemen.catatPermainan(klubKandang, klubTandang, skor);
  90. }
  91. });
  92.  
  93. console.log("--- Hasil cetakKlasemen() ---");
  94. console.log(JSON.stringify(klasemen.cetakKlasemen(), null, 2));
  95.  
  96. console.log(`\n--- Hasil ambilPeringkat(${peringkatToFind}) ---`);
  97. console.log(klasemen.ambilPeringkat(peringkatToFind));
  98. });
Success #stdin #stdout 0.07s 41164KB
stdin
Liverpool,Chelsea,Arsenal
Arsenal,Liverpool,2:1
Arsenal,Chelsea,1:1
Chelsea,Arsenal,0:3
Chelsea,Liverpool,3:2
Liverpool,Arsenal,2:2
Liverpool,Chelsea,0:0
2
stdout
--- Hasil cetakKlasemen() ---
{
  "Arsenal": 8,
  "Chelsea": 5,
  "Liverpool": 2
}

--- Hasil ambilPeringkat(2) ---
Chelsea