얼마전 JAVA매냐(?) 친구 한명이 메신저를 통해 재미있는 문제를 내 주었습니다.
For문을 이용해 ‘*’로 다이아몬드, 하트를 출력하는 문제 였는데요. For문을 자유자재로 사용 할 수 있게 되면 아무래도 프로그래밍에 많이 유리해 지기 때문에 한번 권해 보더라구요^^
그 친구는 얼마전에 이미 만들어 봤는데 재미 있었다는 이야기와 함께..
For문은 반복문과 조건문 게다가 변화값까지 한번에 셋팅할 수 있는 만능 명령어이기 때문에 자유자재로 구사 할 수 있게 되면, 그야말로 For문 한종류만 써서도 프로그램을 짤 수 있으니까요. For문으로 If문까지 처리를 할 수 있으니..
제 블로그를 통해 제가 친구에게 받았던 문제를 한번 내 보겠습니다^^
관심 있으신 분들은 재미로라도 한번 풀어보세요.
제가 만든 출력 화면은 참고를 위해 띄우고, 소스는 폴딩 처리를 해 놓겠습니다.
처음부터 소스를 보진 마시고, 한번 만들어 보신 다음에 소스를 비교해 보아요^^
첫번째 문제입니다.
‘*’을 이용해 다이아몬드를 출력 하시오.
[#M_소스 보기|소스 숨김|
class diamond
{
public static void main(String[] args)
{
int i; //변수 i 지정
for(i = 12; i < 20; i+=2){
pprn(20 – i); //공백을 출력하는 함수 호출
pprns(i*2); //*을 출력하는 함수 호출
System.out.println(); //한줄을 완성하면 줄 내림
}
/* 다이아몬드의 머리를 출력하는 For문 종료*/
for(i = 20; i >= 0; i-=2){
pprn(20 – i); //공백 출력 함수 호출
pprns(i*2); //*을 출력하는 함수 호출
System.out.println(); //한줄이 완성되면 줄내림
}
/* 다이아몬드의 아랫도리 출력*/
}
/*a로 받아들인 int만큼 공백을 출력하는 메소드*/
static void pprn(int a){
int j;
for(j = 0; j < a; j++)
System.out.print(” “);
}
/*a로 받아들인 int만큼 *을 출력하는 메소드*/
static void pprns(int a){
int j;
for(j = 0; j <= a; j++)
System.out.print(“*”);
}
}
/* 우리는…. 자바 매니아 입니다~ㅋ*/
_M#]
두번째 문제입니다.
‘*’을 이용해 하트를 출력 하시오.(다이아몬드 출력 응용편)
[#M_소스 보기|소스 숨김|
class heart
{
public static void main(String[] args)
{
int i; //변수 i 지정
for(i = 4; i < 10; i+=2){
pprn(10 – i); //공백을 출력하는 함수 호출
pprns(i*2); //*을 출력하는 함수 호출
pprn((10 – i)*2); //하트의 갈라지는 부분 공백
pprns(i*2); //갈라진 이후에 연결되는 *출력
System.out.println(); //한줄을 완성하면 줄 내림
}
/* 하트의 머리를 출력하는 For문 종료*/
for(i = 20; i >= 0; i-=2){
pprn(20 – i); //공백 출력 함수 호출
pprns(i*2); //*을 출력하는 함수 호출
System.out.println(); //한줄이 완성되면 줄내림
}
/* 하트의 아랫도리 출력*/
}
/*a로 받아들인 int만큼 공백을 출력하는 메소드*/
static void pprn(int a){
int j;
for(j = 0; j < a; j++)
System.out.print(” “);
}
/*a로 받아들인 int만큼 *을 출력하는 메소드*/
static void pprns(int a){
int j;
for(j = 0; j <= a; j++)
System.out.print(“*”);
}
}
/* 우리는…. 자바 매니아 입니다~ㅋ*/
_M#]
우리 모두 재미있는 자바 문제를 풀어 BOA요~^^
혹시 다른 재미있는 방법으로 문제를 풀으신 분들은 댓글을 달아 주시와요~^^
마치 나치가 개발했다는 UFO로 나메크성인의 편지를 읽는 것같은 느낌이드네요.
뭐 싸인펜님에게 아동의 사고영역의 제한성으로 인한 수학학습장애에 맞는 교수방법을 설명해드리면 지금 제가 느끼는 거랑 똑같은 느낌을 받으시겠죠? ㅎ
하하^^ 나메크성인의 편지였군요ㅋ
전공이 컴퓨터이다 보니까 수업을 듣거나 재미있는 무언가를 발견하게 되면 가끔 글을 써 볼려고 새로운 카테고리를 만들어 봤습니다.
아동의 사고영……………;;;??!!??!!…..
네..;; 같은 느낌이겠군요^^ㅋ
소스를 다시 코딩해야 할듯… 크기조절이 안되는구나 예를 들어 DiamondSize를 10으로 줄때와 15로 줄때등 다이아몬드사이즈 수치만을 바꾸어 자동으로 크게만들어지고 작게만들어지고….
그거 가능하긴 한데, 다이아몬드를 좀 크게 만드느라 수치 손보는게 좀 복잡해져 버려서말야..
내일 그부분 내가 수정해볼게..ㅇㅋㅇㅋ
class diamond
{
public static void main(String[] args)
{
int i; //변수 i 지정
int s = 20, h = 6;
/*다이아몬드 반쪽의 높이 = s/2, 가로 폭 = s*2, 다이아몬드 머리의 높이 = s-2h-1*/
for(i = h*2; i < s; i+=2){ //기존의 수치들 대신 각각 h와 s 대입 pprn(s - i); //처음의 20대신 s로 대입 pprns(i*2); System.out.println(); } for(i = s; i >= 0; i-=2){
pprn(s – i); //처음의 20대신 s로 대입
pprns(i*2);
System.out.println();
}
/* 다이아몬드 크기 수정을 수월하게 하기 위해서 크기와 관련한 수치들을 변수로 지정하였음.
s수치의 2배는 가로로 찍히는 별의 갯수이며 더불어 다이아몬드 하단 부분의 높이의 1/2
h는 다이아몬드의 상단 높이와 관련 되어 있음.
상단 높이의 크기는 s-2h-1의 값을 가짐. s>h*2의 값을 항상 만족하여야 함. */
소스 상단부분만 살짝 변형시키면 크기 조정이 가능해져서 수정된 부분만 새로 주석을 붙여서 적어볼게..
약간 넙데데한 다이아몬드를 만들려다 보니깐 수정하기가 이렇게 까다로워지네..;;;
에, 그다지 잘 짰다고 자신할 수 없지만 제가 ◆만들때 쓰던걸 자바로 옮기고 고쳐봤습니다. 그냥 이런게 있구나 하는정도로만 봐주세요 ㅠ.ㅠ
import java.math.BigDecimal; // abs()를 쓰기위해 math패키지를 임포트 시킴
public class dia
{
void showChar(int scope, char chr) // 수행 범위, 표현할 문자 입력 받고 출력하는 메소드
{
for (int i=0; i < scope; i++) System.out.print(chr); } void showDia(int size) { size=size/2+1; for (int i = -(size>>1)+1; i < size; i++) { showChar(Math.abs(i)<<1, ' '); // 공백 출력 showChar(((size-Math.abs(i))<<2)-3, '*'); // 애스테리스크 출력 System.out.println(); // 개행 } } public static void main(String[] args) { dia d = new dia(); // 오브젝트 생성 d.showDia(20); // 메소드 실행 } } 구조적 프로그래밍을 배우다 최근 자바를 배우면서 객체지향이라는걸 접했는데 "객체지향"적인 느낌이 무엇인지 아직 감을 못잡았습니다 ㅠ.ㅠ 지금 거의 구조적인데 그냥 무시하시고 봐주세요 ^^;
헉,,,, 훌륭하십니다.
제가 손대지 못한 사이즈 변경 부분이 화현님의 코드에선 너무 깔끔하게 구현 되어 있군요…;;
그 외의 부분들도 너무나 깔끔하구요.
화현님의 코드가 너무 아름다워 보입니다^ㅡ^