BOJ 2448 별찍기 - 11

1 개요[ | ]

BOJ 2448 별찍기 - 11
  • 그리고자 하는 삼각형의 크기와 위치에 대한 함수를 정의해 재귀적으로 문제를 해결해봅니다

2 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);
        }
    }
}

3 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);
}

4 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);
}

5 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)
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}