ข้อสอบท้ายค่าย 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)
#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;
}