[로직]다이아몬드 출력 로직 , 큰 다이아 작은 다이아 출력 하기

 

  • 아는 동생이 컴퓨터공학과 대학교 과제라고 하면서 보내온 큰 다이아, 작은 다이아 동시에 출력하기.
  • 이게 정답 로직은 아니지만 이왕 만든김에 포스팅 합니다.
  • 필자의 경우 PHP 언어가 편해서 PHP로 작성하였음.
    • 필요한경우 변수선언,출력형태만 바꿔 사용하세요

 

1. 왼쪽에 큰 다이아, 오른쪽에 작은 다이아를 출력하시오

 

  • 문제)
    • 왼쪽에 큰 다이아 9*9 (1,3,5,7,9,7,5,3,1)
    • 한칸 띄고 (열 한칸 띄우고)
    • 오른쪽에 작은 다이아  (1,3,5,3,1) 을 출력하시오

문제, 위의 다이아를 출력하시오.

 

2. 풀이

 

  • 1) 행 열의 갯수를 먼저 살펴봐야 한다.
    • 9*9, 한칸 열 띄우고, 5*5 의 경우
    • 총 행은 9행
    • 총 열은 15열 ( 큰다이아 9열, 띄어쓰기1열, 작은다이아 5열)
  • 2) 규칙을 찾아라
    • 반복문을 몇개를 써야하는지 코딩하기 전에 알고리즘을 생각해봐야 된다.
    • 필자의 경우 심심풀이로 해서 코드 간소화 까지 생각하지는 않았다.
    • 큰 다이아의 경우 중간 5행은 전부 '*' 표시 해야했고
    • 위에 1~4는 , 행의 값( x값 )  - 1 = 중간 열( 기준되는 y축 5열 )의 +갯수만큼 표시했어야 했고
    • 아래 6~9는, 역 피라미드이기 때문에 행의 값{ 총 행 9 - 현재 행의 값 (x 값) 을 기준삼아}
    • 열의 기준 (y=5)의 경우 y +- 5-(9-x) 값으로 계산했다.
    • 이해가 안가시는 분은 자신만의 방정식을 찾아보세요!
  • 3) 필자는 웹개발자이기 때문에 출력을 가독성있게 하기위해 테이블 사용함.
    • 과제하는사람들은 알아서 고쳐 쓰세요 ^^;;
function get_diamond_table(){
    $return = "<table border='1' id='tableleft'>";
    for($i=1; $i<10; $i++){ // 큰다이아 9행, 작은다이아 5행 포함 도합 1~9
        $return .= "<tr>";
        for($j=1 ; $j < 16; $j++){ // 큰다이아 1~9, 띄우는칸 10 ,작은다이아 11~15 도합 1~15
            if($j<10){ //왼쪽 큰 다이아몬드. 9행 9열, 9열이기 때문에 $j가 10보다 작을떄.
                if($i<5){ // 1~4행 피라미드 형식.
                    $x = $i-1; // 각 행의 -1의 값만큼 줌심 열의 양옆에 * 표시 하기위해 정의
                    if($x != 0){ // x가 0이 아닐경우 중심열 양옆에 *를 표시해야 할 일이 생김.
                        if($j == 5 ){ // 중심열 5행열은 전부 * 표시
                            $return .= "<td bgcolor='#ffc0cb'>*</td>";
                        }else if($j >= 5-$x && $j <=5+$x){ //중심열 5의 앞뒤행을 필요한 값만큼 더 * 표시
                            $return .= "<td bgcolor='#ffc0cb'>*</td>";
                        }else{ // 아무것도 아닐 경우 공백 혹은 - 표시
                            $return .= "<td>&nbsp;</td>";;
                        }
                    }else{ // 1행의 경우 5열에 하나만 * 표시 , 나머지는 - 표시
                        if($j==5){
                            $return .= "<td bgcolor='#ffc0cb'>*</td>";
                        }else{
                            $return .= "<td>&nbsp;</td>";;
                        }
                    }
                }else if($i == 5){ // 5행은 큰다이아몬드 중심 행. 전부 * 표시
                    $return .= "<td bgcolor='#ffc0cb'>*</td>";
                }else{ // 나머지일경우, 5~9행 역 피라미드 형식.
                    $x = 9-$i; // 역 피라미디 이기 때문에 총 열의개수 9에서 해당 행을 뺀 값이 *표시의 개수가 되야됨.
                    if($x != 0){ // 9행이 아닌 6~8행의 경우,
                        if($j == 5){ // 중심열 5행열은 전부 * 표시
                            $return .= "<td bgcolor='#ffc0cb'>*</td>";
                        }else if($j >= 5-$x && $j <=5+$x){ //중심열 5의 앞뒤행을 필요한 값만큼 더 * 표시
                            $return .= "<td bgcolor='#ffc0cb'>*</td>";
                        }else{ // 아무것도 아닐 경우 공백 혹은 - 표시
                            $return .= "<td>&nbsp;</td>";;
                        }
                    }else{ //9행의 경우 열의중심 5열만 *, 나머지는 공백 또는 - 표시
                        if($j==5){
                            $return .= "<td bgcolor='#ffc0cb'>*</td>";
                        }else{
                            $return .= "<td>&nbsp;</td>";;
                        }
                    }
                }
            }else if ($j == 10){ // 칸 띄운다.
                $return .= "<td>&nbsp;</td>";; //칸을 한칸 띄운다.
            }else{
                //오른쪽 작은 다이아몬드. 5행 5열
                if($i<3){ //위 2행, $i는 1부터 시작하니 $i<3 -> 1,2행
                    $x = $i-1;
                    if($j==13){ // 13번 열이 작은 다이아몬드의 중심부
                        $return .= "<td bgcolor='#ffc0cb'>*</td>";
                    }else if($j >= 13-$x && $j <=13+$x){ // $i-1의 값을 $j의 앞뒤로 붙여서 *을 표시
                        $return .= "<td bgcolor='#ffc0cb'>*</td>";
                    }else{ // 아무 해당없을경우 공백 혹은 '-' 표시
                        $return .= "<td>&nbsp;</td>";;
                    }
                }else if($i == 3){ // 작은다이아몬드 행의 중심 3은 전부 * 표시 (5행 이니까 가운데 3)
                    $return .= "<td bgcolor='#ffc0cb'>*</td>";
                }else if($i < 6){ // 그 이외 4,5열 까지 작은다이아몬드이니 $i < 6 으로 분기
                    $x = 5-$i;
                    if($j==13){ // 13번 열이 작은 다이아몬드의 중심부
                        $return .= "<td bgcolor='#ffc0cb'>*</td>";
                    }else if($j >= 13-$x && $j <=13+$x){ // $i-1의 값을 $j의 앞뒤로 붙여서 *을 표시
                        $return .= "<td bgcolor='#ffc0cb'>*</td>";
                    }else{ // 아무 해당없을경우 공백 혹은 '-' 표시
                        $return .= "<td>&nbsp;</td>";;
                    }
                }else{
                    $return .= "<td>&nbsp;</td>";;
                }
            }
        }
        $return.= "</tr>"; // 행을 표시하기 위해 한줄 띄워준다.
    }
    $return .= "</table>";

    return $return;
}


$diamond = get_diamond_table();


echo $diamond;

출력 형태