개요
- BOJ 2448 별찍기 - 11
- 그리고자 하는 삼각형의 크기와 위치에 대한 함수를 정의해 재귀적으로 문제를 해결해봅니다
Java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
private static int total;
private static void drawStarRow(ArrayList<Integer> row) {
int width = row.size();
String line1 = "";
String line2 = "";
String line3 = "";
for( int i=0; i<width; i++ ) {
if( row.get(i) == 1 ) {
line1 += " * ";
line2 += " * * ";
line3 += "***** ";
}
else {
line1 += " ";
line2 += " ";
line3 += " ";
}
}
String pad = "";
for(int i=0;i<total-width;i++) pad+=" ";
System.out.println(pad+line1+pad);
System.out.println(pad+line2+pad);
System.out.println(pad+line3+pad);
}
private static ArrayList<Integer> getNextRow(ArrayList<Integer> prev) {
prev.add(0);
prev.add(0,0);
ArrayList<Integer> next = new ArrayList();
for( int i=1; i<prev.size(); i++ ) {
next.add( prev.get(i-1)^prev.get(i) );
}
return next;
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
total = sc.nextInt() / 3;
// System.out.println(k);
ArrayList<Integer> row = new ArrayList();
row.add(1);
// System.out.println( row.toString() );
drawStarRow(row);
for( int i=0; i<total-1; i++ ) {
row = getNextRow(row);
// System.out.println( row.toString() );
drawStarRow(row);
}
}
}
Perl
sub draw_star_row {
my @row = @_;
our $total;
$width = ~~ @row;
$line1 = $line2 = $line3 = '';
for($i=0; $i<$width; $i++) {
if( $row[$i] eq 1 ) {
$line1 .= ' * ';
$line2 .= ' * * ';
$line3 .= '***** ';
next;
}
$line1 .= ' ' x 6;
$line2 .= ' ' x 6;
$line3 .= ' ' x 6;
}
$pad = ' ' x ($total-$width);
print $pad . $line1 . $pad . "\n";
print $pad . $line2 . $pad . "\n";
print $pad . $line3 . $pad . "\n";
}
sub get_next_row {
@prev = @_;
unshift @prev, 0;
push @prev, 0;
$cnt = ~~ @prev;
@next = ();
for($i=1; $i<$cnt; $i++) {
push @next, $prev[$i-1] ^ $prev[$i];
}
return @next;
}
$n = <>;
$total = $n / 3;
@row = (1);
draw_star_row(@row);
for( $i=0; $i<$total-1+2; $i++ ) {
@row = get_next_row(@row);
draw_star_row(@row);
}
PHP
<?php
function draw_star_row($row) {
global $total;
$width = count($row);
$line1 = $line2 = $line3 = '';
for($i=0; $i<$width; $i++) {
if( $row[$i] == 1 ) {
$line1 .= ' * ';
$line2 .= ' * * ';
$line3 .= '***** ';
continue;
}
$line1 .= ' ';
$line2 .= ' ';
$line3 .= ' ';
}
$pad = str_repeat(' ',$total-$width);
echo $pad . $line1 . $pad . "\n";
echo $pad . $line2 . $pad . "\n";
echo $pad . $line3 . $pad . "\n";
}
function get_next_row($prev) {
array_unshift($prev, 0);
$prev[] = 0;
$cnt = count($prev);
$next = [];
for($i=1; $i<$cnt; $i++) {
$next[] = $prev[$i-1] ^ $prev[$i];
}
return $next;
}
fscanf(STDIN,'%d',$n);
$total = $n / 3;
$row = [1];
draw_star_row($row);
for( $i=0; $i<$total-1; $i++ ) {
$row = get_next_row($row);
draw_star_row($row);
}
Python
def draw_star_row(row):
global total
width = len(row)
line1 = line2 = line3 = ''
for i in range(width):
if row[i] == 1:
line1 += ' * '
line2 += ' * * '
line3 += '***** '
continue
line1 += ' '
line2 += ' '
line3 += ' '
pad = ' ' * (total-width)
print( pad + line1 + pad )
print( pad + line2 + pad )
print( pad + line3 + pad )
def get_next_row(prev):
prev.insert(0,0)
prev.append(0)
next = []
for i in range(len(prev)-1):
next.append( prev[i] ^ prev[i+1] )
return next
n = int(input())
total = n // 3
row = [1]
draw_star_row(row)
for i in range(total-1):
row = get_next_row(row)
draw_star_row(row)