การพิมพ์รูปสามเหลี่ยมมุมฉากว่าง (Hollow Right Triangle) ใน Java
รูปสามเหลี่ยมมุมฉากว่าง: แถวแรกและแถวสุดท้ายพิมพ์ดาวเต็ม แถวกลางพิมพ์ดาวเฉพาะขอบซ้ายและขวา กลางเป็นช่องว่าง
อัลกอริทึม
- รับขนาด
n(จำนวนแถว) - ลูปแถว i = 1 ถึง n
- ถ้า i == 1 หรือ i == n: พิมพ์ดาว i ดวง (แถวเต็ม)
- กรณีอื่น: ลูปคอลัมน์ j = 1 ถึง i, พิมพ์ดาวที่ j==1 และ j==i, ที่เหลือพิมพ์ช่องว่าง
ตัวอย่างที่ 1: รับค่าจากผู้ใช้ (Scanner)
import java.util.Scanner;
public class HollowRightTriangle {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("ป้อนขนาด: ");
int n = scanner.nextInt();
System.out.println("รูปสามเหลี่ยมมุมฉากว่าง:");
for (int i = 1; i <= n; i++) {
if (i == 1 || i == n) {
// แถวแรกและสุดท้าย: ดาวเต็ม
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
} else {
// แถวกลาง: ดาวขอบซ้ายและขวา
for (int j = 1; j <= i; j++) {
if (j == 1 || j == i) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
}
System.out.println();
}
}
}
ตัวอย่างที่ 2: ค่าคงที่ (Hardcoded)
public class HollowRightTriangle {
public static void main(String[] args) {
int n = 8;
System.out.println("ขนาด: " + n);
System.out.println("รูปสามเหลี่ยมมุมฉากว่าง:");
for (int i = 1; i <= n; i++) {
if (i == 1 || i == n) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
} else {
for (int j = 1; j <= i; j++) {
System.out.print((j == 1 || j == i) ? "*" : " ");
}
}
System.out.println();
}
}
}
ผลลัพธ์ (n=6)
รูปสามเหลี่ยมมุมฉากว่าง:
*
**
* *
* *
* *
******
การปรับปรุง: ใช้ StringBuilder และ String.repeat() (Java 11+)
public class HollowRightTriangleModern {
public static void main(String[] args) {
int n = 8;
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) {
if (i == 1) {
sb.append("*\n");
} else if (i == n) {
sb.append("*".repeat(n)).append("\n");
} else {
sb.append("*");
sb.append(" ".repeat(i - 2));
sb.append("*\n");
}
}
System.out.print(sb.toString());
}
}
รูปแบบแปรผัน: Hollow Right Triangle เฉียงขวา (Right-aligned)
public class RightAlignedHollowTriangle {
public static void main(String[] args) {
int n = 6;
for (int i = 1; i <= n; i++) {
// ช่องว่างหน้า
System.out.print(" ".repeat(n - i));
if (i == 1 || i == n) {
System.out.print("*".repeat(i));
} else {
System.out.print("*");
System.out.print(" ".repeat(i - 2));
System.out.print("*");
}
System.out.println();
}
}
}
ผลลัพธ์ Right-aligned (n=6)
*
**
* *
* *
* *
******
การวิเคราะห์
- Time: O(n²)
- Space: O(1) เพิ่มเติม
- Logic: แถวแรก/สุดท้าย = solid, แถวกลาง = hollow edges