반응형

다음 다이어몬드 모양과 같이 출력되는 프로그램을 작성하라.(받아들이는 숫자의 범위는 1-20까지이며, 0 입력되면 프로그램 종료된다.)

 

10-1. 해법 정리

1) 숫자를 입력 받아서 num 변수에 저장

2) 입력 받은 num20을 초과하거나 0이면 종료, 20이하면 프로그램 실행

-위쪽 다이아몬드-

3) 인덱스 변수 i 1부터 입력한 숫자까지 증가하는 반복문

4) 3) 반복문 안에서 공백을 표시할 또 다른 반복문 동작(j 1부터 입력값-i 만큼 증가)

5) 3) 반복문 안에서 별을 표시할 또 다른 반복문 동작(k 1부터 2*i-1만큼 증가)

6) 3) 반복문의 한 턴(turn)이 끝나면 한 줄을 띄워 주기

       -아래쪽 다이아몬드-

7) 인덱스 변수 i num-1부터 1이 될 때까지 감소하는 반복문

8) 7) 반복문 안에서 공백을 표시할 또 다른 반복문 동작(j 1부터 입력값-i 만큼 증가)

9) 7) 반복문 안에서 별을 표시할 또 다른 반복문 동작(k1부터 2*i-1만큼 증가)

10) 7) 반복문의 한 턴(turn)이 끝나면 한 줄을 띄워 주기

 

10-2. 풀이 과정

 

이 문제 또한 바로 해결되진 않았습니다. 10-1 해법 정리에서 정리한 대로의 결과를 도출해 내기까지 많은 시간이 소모되었습니다.

3을 입력했을 때, 표시되는 결과는 총 5줄입니다. 이에 착안해서, 위와 아래로 각각 나누어 풀이해 보려고 했습니다. 증가하는 쪽은 위쪽이라서 이것만 해결한다면 아래에 표시하는 부분은 금방 해결할 수 있을 거라는 생각을 했습니다.

<사진 설명> 먼저, 입력 받은 값이 어떤지 검사하는 과정은 생략하고 진행했습니다.

다이아몬드가 표시되는 위쪽의 별모양부터 구현해 보려고 했습니다. 그래서 일단 별모양이 보이기 전의 공백을 표시해야 하지만 스페이스 바로 표현되어 마우스로 드래그하지 않으면 얼마만큼 띄워졌는지 알 수 없었습니다.

<사진 설명> 공백 대신에 텅 빈 별모양으로 채워서 궁리한 끝에 다이아몬드의 위쪽을 만드는 데 성공했습니다. 공백의 크기를 num-1만큼 표현하고, 별 모양을 위에서부터 하나씩 증가시킨 모습입니다.

<사진 설명> 더 쉽게 알아보기 위해 줄이 어디에서 띄워졌는지 알 수 있도록 했습니다. 아직까지 제대로 된 다이아몬드와는 거리가 있습니다.

<사진 설명> 다이아몬드를 구성해야 할 별을 2배로 증가시켰더니, 해결에 근접할 수 있었습니다.

<사진 설명> 하지만 2배로 곱한 i는 별의 개수가 하나 많았습니다. 그래서 -1을 첨가해서 정상적으로 보기 좋게 만들었습니다.

<사진 설명> 아래쪽을 구현하기 위해 일단 위쪽 부분을 복사해 놓았습니다.

<사진 설명> 아래쪽의 구현에 성공한 모습입니다. 위쪽을 구현할 때 얻은 지식(공백, , 한 줄 띄우기)을 응용하여 금방 만들어 낼 수 있었습니다. 위 스크린샷에는 첫 루프문이 for(int i=num-1; i>=0; i--)라고 되어 있는데, 이 부분을 for(int i=num-1 ; i>0 ; i--)로 고쳐서 정상적으로 표현되게 할 수 있었습니다.

10-3. 소스 코드(Diamond.java)

10-4. 실행 화면

<사진 설명> 5를 입력했을 때 결과 화면

<사진 설명> 최대 값(20)을 입력했을 때 결과 화면. 만족스러운 결과를 표시하고 있습니다

<사진 설명> 0을 입력했을 때, 종료되는 모습

<사진 설명> 1을 입력했을 때 단지 별 하나만 나타납니다

<사진 설명> 30을 입력했을 때, 20이하로 입력하라는 메시지가 나타나고, 동시에 종료됩니다.

10-5. 시행 착오

이번 문제는 시행 착오를 아주 많이 겪었습니다. 10-2의 풀이 과정에서도 보실 수 있듯이 처음에 얼마 만큼의 공백을 입력해야 하는지, 별 모양을 i*2-1만큼 입력해야 한다는 깨달음, 아래쪽을 구현할 때 위쪽과는 다르게 감소시켜야 하는 구문을 입력하면서 제법 많은 시간이 소모되었습니다.

 위쪽을 대략적으로 마치고 나니 아래쪽은 그야말로 금방 풀 수 있었습니다. 생각하고 있는 것을 코드로 만들어 낸다는 것이 쉽지 만은 않은 것 같습니다.



반응형
,