APCS實作題2022年6月第1題數字遊戲參考解法

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

If you like this post, please click the ads on the blog or buy me a coffee. Thank you very much.

題目連結 https://zerojudge.tw/ShowProblem?problemid=i399

題目說明
給三個介於 1 ~ 9 的整數 A1,A2,A3。
先輸出一個正整數 P 表示眾數數量,也就是出現最多次的數字的次數。
接下來將輸入的三個數字去除重複(剩下一個)後由大到小依序輸出。

範例一:
輸入 6 6 6 ,輸出 3 6。
因為出現最多次的數字是 6,共出現 3 次,並且只有出現 6 這個數字,因此輸出 3 6。

範例二:
輸入 7 9 7 ,輸出 2 9 7。
因為出現最多次的數字是 7,共出現 2 次,並且出現了 7 和 9,因為集合需要由大到小輸出,因此輸出 2 9 7。

範例三:
輸入 4 1 8 ,輸出 1 8 4 2。
因為三個數字各出現 1 次,集合由大到小輸出,因此輸出 1 8 4 1。

想法:
  1. 將輸入的數字記錄在陣列A。
  2. 用陣列或串列cnt紀錄數字 1 ~ 9 各自出現幾次。找次數陣列cnt中的次數最大值。
  3. 依次數值對陣列A由小排到大。
  4. 對陣列A,從最大值開始輸出不重複的數字,

C++ 程式碼
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
  const int N = 3;
  int a[N];

  while(cin >> a[0] >> a[1] >> a[2]) {
    int cnt[10] = {0};  // 紀錄數字 1 ~ 9 各自出現幾次
    // 算數字 1 ~ 9 各自出現幾次
    for(int i = 0; i < N; i++)
      cnt[a[i]]++;
    // 找眾數數量P
    int P = 0;
    for(int i = 0; i < 10; i++)
      if(P < cnt[i]) P = cnt[i];
   
    cout << P << " ";
    sort(a, a + N);   // 由小排到大
    cout << a[2];     // 從最大數字輸出

    for(int i = 1; i >= 0; i--)
      if(a[i+1] != a[i]) // 輸出不重複的數字
        cout << " " << a[i];

    cout << endl;
  }
  return 0;
}


Python 程式碼
while True:
    try:
        A = list(map(int, input().split()))
        # 紀錄數字 1 ~ 9 各自出現幾次
        cnt = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
        # 算數字 1 ~ 9 各自出現幾次
        for a in A:
            cnt[a] = cnt[a] + 1
        # 找眾數數量P
        P = max(cnt)
        print(P, end = " ")
        A.sort() #  由小排到大
        print(A[2], end = "") # 從最大數字輸出

        for idx in range(1, -1, -1):
            if A[idx+1] != A[idx]: # 輸出不重複的數字
                print(" " + str(A[idx]), end="")        
        print()
    except EOFError:
        break


沒有留言: