- 아는 동생이 컴퓨터공학과 대학교 과제라고 하면서 보내온 큰 다이아, 작은 다이아 동시에 출력하기.
- 이게 정답 로직은 아니지만 이왕 만든김에 포스팅 합니다.
- 필자의 경우 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> </td>";;
}
}else{ // 1행의 경우 5열에 하나만 * 표시 , 나머지는 - 표시
if($j==5){
$return .= "<td bgcolor='#ffc0cb'>*</td>";
}else{
$return .= "<td> </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> </td>";;
}
}else{ //9행의 경우 열의중심 5열만 *, 나머지는 공백 또는 - 표시
if($j==5){
$return .= "<td bgcolor='#ffc0cb'>*</td>";
}else{
$return .= "<td> </td>";;
}
}
}
}else if ($j == 10){ // 칸 띄운다.
$return .= "<td> </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> </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> </td>";;
}
}else{
$return .= "<td> </td>";;
}
}
}
$return.= "</tr>"; // 행을 표시하기 위해 한줄 띄워준다.
}
$return .= "</table>";
return $return;
}
$diamond = get_diamond_table();
echo $diamond;
'Language > PHP' 카테고리의 다른 글
[Composer] 외부 패키지를 마음대로 커스텀하기 (0) | 2022.03.04 |
---|---|
[로직]바람개비 출력 로직 , 큰 바람개비 작은 바람개비 출력 하기 (4) | 2020.04.23 |
[로직]모래시계 출력 로직 , 큰 모래시계 작은 모래시계 출력 하기 (1) | 2020.04.23 |
[로직]이등변 삼각형 출력 로직 , 큰 이등변 삼각형 작은 이등변 삼각형 출력 하기 (1) | 2020.04.23 |
PHP htmlspecialchars() 사용 시 특정 한글 깨짐 현상 해결 (0) | 2020.04.17 |