Skip to content

ข้อสอบท้ายค่าย 1 ศูนย์ สอวน.กรุงเทพมหานคร ปี 2567 ข้อที่ 2


Problem

สรุปโจทย์

เรามี String จำนวน 2 อัน และเราต้องการหาตัวอักษรที่ซ้ำกัน (ต้องเป็นตัวพิมพ์เล็ก-พิมพ์ใหญ่เหมือนกันด้วย)

สิ่งที่ต้องทำ

เขียนโค้ดเพื่อหาตัวอักษรที่ซ้ำกัน

ตัวอย่าง

Input Output
PHYSICSMATH
COMPUTER
C M P T
agodinCAR
bookontable
a o n

Prerequisites

  • Arrays
  • Strings

Solution

วิธีทำที่ 1 (Brute Force)

รับ Input เข้ามา แล้วเราจะ Loop ตามตัวอักษรแต่ละตัวใน String แรก ซึ่งแต่ละครั้งที่ Loop เราจะ Loop ตั้งแต่ตัวอักษรแรกจนจบของ String ที่สอง แล้วเมื่อเจอตัวอักษรซ้ำ เราก็สามารถเก็บเอาไว้ว่า ตอนจบการทำงานโปรแกรม จะพิมพ์ตัวอักษรตัวนี้ออกมา (ใช้ Array ในการเก็บ)

วิธีทำที่ 2 (Arrays)

รับ Input มาเป็น String แล้วเราก็แค่ Loop ตามตัวอักษรแต่ละตัว และเมื่อพบแต่ละตัว ก็นับเพิ่มลงใน Array ที่จะเก็บเป็นตัวเลข ว่าพบตัวอักษรที่ \(i\) มาแล้วกี่ตัว ซึ่งเราจะมีอยู่ 2 Array (ตั้งชื่อว่า \(count\_a\) และ \(count\_b\)) แล้วเมื่อเรา Loop ตามตัวอักษรของ String \(a\) เราจะเขียนว่า \(count\_a[a[i]]\)++; (เหตุผลที่เราทำแบบนี้ได้ เป็นเพราะว่า ในภาษา C จะ convert ตัวอักษร ให้เป็นค่า ASCII VALUE ของมันให้เลย) เมื่อเราเก็บค่าใน \(count\_a\) ครบหมดแล้ว รอบนี้ เราจะ Loop ตามตัวอักษรของ String \(b\) แล้วถ้าหากว่าตัวอักษรตัวนี้ เคยปรากฏขึ้นใน \(a\) โดยที่มันปรากฏครั้งแรกใน \(b\) เราจะทำการพิมพ์ตัวอักษรออกมา ตามที่โจทย์กำหนดให้นั่นเอง


Code (วิธีทำที่ 2)

repeating_string.c
#include <stdio.h>
#include <string.h>

int main(){
    char a[25], b[25];
    scanf("%s %s", a, b);
    int n = strlen(a), m = strlen(b); // strlen(): หาความยาวของ String

    // นับการโผล่ตัวของตัวอักษรแต่ละตัวในสตริง A
    int count_a[200] = {0};
    for (int i = 0; i < n; i++) {
        count_a[a[i]]++;
    }

    // loop เพื่อหาคำตอบ
    int count_b[200] = {0};
    for (int i = 0; i < m; i++) {
        // ถ้าหากว่าตัวอักษรนี้โผล่มาใน A และโผล่มาใน B เป็นครั้งแรก ก็ให้พิมพ์ออกมา
        if (count_a[b[i]] > 0 && count_b[b[i]] == 0) {
            printf("%c ", b[i]);
            count_b[b[i]]++;
        }
    }
    return 0;
}