Java (자바)

[Java] 반복문 - for 문 / 도형 만들기(마름모, 별, 원)

Oscar:) 2022. 4. 17. 18:54

 

코드를 작성하다보면, 똑같은 & 비슷한 방식으로 여러번 적게되는 로직이 분명히 있을 것이다.

뭐, 손가락으로 세어질 정도의 양은 직접 코드를 작성해도 상관없다고 치자.

 

하지만, 만렙이 1000레벨인 RPG게임으로 가정하고 간단히 예를 들어보자.

1레벨부터 1000레벨까지의 레벨업하는 과정을 1000개의 코드로 직접 작성할 수 있을까?

 

레벨업이라는 기준으로, 변경되는 수치들을 포함하여 (레벨, 능력치, 최대 exp 등)

반복된 로직으로 구현했다고 볼 수있다.

 

 

꼭 레벨업이 아니더라도, 반복문은 거의 모든 프로그램에서 필수적으로 사용되며

우리의 고생을 덜어줄 수 있는.. 정말 고마운 문법이다.

 

반복문의 종류도 여러가지가 있는데,

이번 포스팅에서는 for문에 대해 알아보자.

 


for문의 기본 문법은 다음과 같다.

for (초기화식 ; 조건식 ; 증감연산) { 반복할 내용 }

+ 조건식에서 연산을 실행할 수 있다.
+ 경우에 따라서 변수 초기화, 증감연산은 작성하지 않아도 작동한다.

 

 

1씩 증가하는 반복문

 

1부터 29까지 일일이 출력해주지 않아도,

반복문을 이용하여 손쉽게 출력 가능한 모습을 확인할 수 있다.

 


마찬가지로, 10부터 1까지 줄어드는 반복문이다.

숫자 느낌만 봐서는, 타이머를 만들 수 있을것만 같다. ( 스레드를 배우면 가능하다 )

 


여기서부터, 우리는 발상의 전환을 해야만 한다.

저 반복문의 조건식에 a를 사용했지만,
출력할 때는 a가 아닌 다른 문자를 사용하면 어떻게 될까?

위와 같이, 별모양이 30개 찍힌것을 확인할 수 있다.

 

 

그렇다면, for문 안에 for문을 넣으면 어떻게 될까?

 

'반복문을 반복해서 도형 만들기'를 시작해보겠다.


도형 만들기 - 사각형

 

10개의 열, 5개의 행을 가진 ★모양으로 이루어진 사각형을 만드는데 성공했다.

 


도형을 찍어내려면, print 와 println의 줄바꿈 속성의 차이점을 숙지하고 있어야

원하는 모양을 제대로 표현할 수 있다.

줄바꿈 속성이 미흡하다면 아래 포스팅을 참고하자.

 

[JAVA] 자바 출력문 print / println ( + 줄바꿈 \n,\r,\r\n )

우리는 workspace에 온갖 코드를 열심히 적는다. 그리고 그 코드중에는, 내부적으로 열심히 일만 하는 녀석도 있고, 외부에 보여져야 하는 내용을 담은 녀석도 있다. (어떻게보면 나중에 알게될 프

oscarstory.tistory.com



도형 만들기 - 직각삼각형

 

a가 1씩 증가하는 점을 이용해, 두번째 for문에서 조건식에 a를 넣어줌으로써

★모양이 1개씩 증가하여 직각삼각형을 만드는데 성공했다.

 


도형 만들기 - 정삼각형

 

공백 또한 문자처럼 한칸을 차지한다는 점을 이용하여 정삼각형을 만들 수 있었다.

 

코드와 콘솔의 비교 가독성을 높이기 위하여, 부분마다 각각 다른 문자로 작성했다. ( ☆,★ )

 


정삼각형 최적화

 

우리는 위에서, 직각삼각형과 정삼각형을 만들어 보았는데

직각삼각형은 1,2,3,4,5이고, 정삼각형은 1,3,5,7,9인 점을 확인할 수 있다.

 

그리하여 간단한 연산(*2-1)을 통해, for문을 한번 더 사용하지 않을 수 있게 되었다.

 


도형 만들기 - 마름모

 

위에서 만들었던 정삼각형과, 반대로 뒤집은 정삼각형을 합쳐서

마름모를 찍어내는데 성공했다.

 

(아랫부분 삼각형은 크기를 한줄 줄여야 깔끔하다)

 


스캐너를 이용해서 도형 크기 변경하기

 

스캐너를 통해서 값을 입력받고, 그 값에 따라서 사이즈가 달라지는 도형을 만들어보자.

 


스캐너 사용법을 모르겠다면, 아래 포스팅을 참고하자.

 

[JAVA] 자바 스캐너 (Scanner) - 콘솔창에 텍스트 입력

이전 글에서, 자바 출력문을 이용하여 데이터를 콘솔창에 출력하는 방법을 배워보았다. 이번에는 데이터를 입력하는 방법을 알아보자. 자바에서 데이터를 입력하는 방법은 종류가 다양한데, 그

oscarstory.tistory.com


 

그동안 직접 크기를 지정하여 도형을 만들어보았지만,

스캐너를 담은 변수를 사용해서 입력값에 따라 크기가 달라지는 마름모를 만드는데 성공했다.

 


도형 만들기 - 별모양 1

 

별모양은 코드의 내용이 너무 길어지기 때문에, 코드 캡처가 어려워서 블럭으로 작성하겠다.

import java.util.Scanner;

public class test {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int a,b,c,d,e;

		int n = sc.nextInt();

		// 머리 부분
		for (a=1; a<=n; a++) {
			for (b=n*2; b>=a; b--) {
				System.out.print(" ");
			}
			for (c=1; c<=a*2-1; c++) {
				System.out.print("#");
			}
			System.out.println();
		}
		
		// 몸통 부분
		for (a=1; a<=n; a++) {
			for (b=1; b<=a; b++) {
				System.out.print(" ");
			}
			for (c=n; c>=a; c--) {
				System.out.print("$");
			}
			for (d=1; d<=n*2-1; d++) {
				System.out.print("@");
			}
			for (e=n; e>=a; e--) {
				System.out.print("%");
			}
			System.out.println();
		}
		
		// 다리 부분
		for (a=1; a<=n; a++) {
			for (b=1; b<=n; b++) {
				System.out.print(" ");
			}
			for (c=n; c>=a; c--) {
				System.out.print("&");
			}
			for (d=1; d<=a*2-1; d++) {
				System.out.print(" ");
			}
			for (e=n; e>=a; e--) {
				System.out.print("#");
			}
			System.out.println();
		}

	}
}

삼각형 2개로 마름모를 만들었던 것과 같이,

머리 · 몸통 · 다리 3부분으로 나누어서 구상했다.

 

콘솔창의 결과는 아래와 같다.

 

마찬가지로, 코드와 콘솔의 비교 가독성을 높이기 위하여

부분마다 각각 다른 문자로 작성했다. ( #, $, @, %, & )

 

별모양을 만들어내는데 성공했다 !

근데 어째 모양이 넙적하니, 영 마음에 들지 않는다.

 


도형 만들기 - 별모양 2

 

다리 부분을 좀 더 넓게 벌리는 느낌으로 수정해보았다.

      	// 다리 부분
		for (a=1; a<=n; a++) {
			for (b=n; b>=a; b--) {
				System.out.print(" ");
			}
			for (c=n; c>=a; c--) {
				System.out.print("&");
			}
			for (d=1; d<=a*4-3; d++) {
				System.out.print(" ");
			}
			for (e=n; e>=a; e--) {
				System.out.print("#");
			}
			System.out.println();
		}

 

결과는 아래와 같다.

 

다리가 길어진 느낌을 내보았다 !

전보다 나아진 것 같기도... 아닌 것 같기도..

 


도형 만들기 - 별모양 3

위에서 해왔던 과정 그대로, 조건식의 연산이나 피연산자를 수정해가면서

직접 도형을 만들어 보길 바라는 마음에. 마지막 별모양의 코드는 업로드하지 않겠다.

 

이번에는 몸통 부분을 더 길게 늘어트려서 날개를 활짝 편 느낌을 주고 싶었는데,

결과는 아래와 같다.

 

그나마 만족스러운 모양이 나온 것 같다 ㅎㅎ;

 


도형 만들기 - 원

 

원 모양을 찍어내기 위해서 정사각형에 덧붙임 작업으로 삽질하던 와중에,,,

원의 방정식을 이용할 수 있다는 것을 알게 되었다.

 

원의 방정식 / 출처 : 네이버 지식백과

 

import java.util.Scanner;

public class test {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int a,b;

		int n = sc.nextInt();

		for (a=0; a<=n*2; a++) {
			for (b=0; b<=n*2; b++) {
				
				// 원의 방정식 이용
				int r = ((a-n)*(a-n)+(b-n)*(b-n));
				 
				// 조건에 해당할 시 문자를 출력하고, 해당하지 않을 시 공백을 출력한다는 느낌
				 if (r <= n) {
					 System.out.print("○ ");
				 } else {
					 System.out.print("  ");
				 }
		
			}
			System.out.println();
		}

	}
}

 

결과는 다음과 같다.

 

 

원의 방정식을 조건문, 반복문과 결합하여

원 모양을 어느정도 구현하는데 성공했다.

 


도형찍기는 for문을 처음 접할 때, 자주 쓰이는 숙달 방법중 하나인데,

이때만큼 for문을 많이 써본적도 없는 것 같다.

 

돌이켜 생각해보면

나만의 코드를 작성하는것에 대한 자신감을 제일 많이 키워주었고,

정답만을 쫓으려 했던 그 '틀'을 깨부숴주었던 첫번째 케이스였다.

 

정해진 방식을 찾아서 해내는 것이 아닌,

내가 직접 생각해보고, 직접 테스트해보며,

하나의 도형을 완성해가는 성취감을 느낄 수 있었던 것 같다.