IT/알고리즘|자료구조

반복 과정에서 조건 판단하기

_KH_ 2025. 2. 6. 23:34

[ *를 n개 출력하되 w개마다 줄 바꿈을 하는 프로그램 작성 ] 

 

예를 들어, n값이 14이고 w값이 5이면

*****

*****

****

라는 출력 결과가 나와야 한다.

 

문제 분석, 입력 및 조건 정리, 출력 규칙 구상, 반복문 설계 순으로 생각해보자.

 

===생각 흐름 정리===

[문제 분석]

1. 별은 n개 출력되어야 한다.

2. 한 줄에는 별이 w개이며, w개가 입력되면 다음줄로 개행(\n) 되어야 한다.

 

[입력 및 조건 정리]

1. 사용자에게 n, w를 입력받아야 한다. -> 스캐너 사용

 

[출력 규칙 구상]

1. 별을 n개 찍는 반복문이 있어야 함

2. w-1개마다 줄 바꿈이 필요하다. 왜 w-1이냐면 i가 0부터 시작하기 때문에.

 

*   *   *    *    *

---------------------

0   1   2    3    4

예를 들어, 한 줄에 5개씩 찍힌다고 치면 i가 0부터 시작하므로 i=4 까지만 출력하고 개행을 해야한다.

 

***** -> (i = 0,1,2,3,4)

***** -> (i = 5,6,7,8,9)

***** -> (i = 10,11,12,13,14)

 

i = 4, 9, 14일 때마다 개행을 한다는 사실을 알 수 있다.

이때 개행이 들어가야하는 i 숫자들을 보면 차례대로 w-1, 2w-1, 3w-1 이라는 규칙을 갖고 있음을 알 수 있다. 

개행이 필요한 값은 i=4,9,14에 위치하는데 이 값들은 항상 i를 w로 나눈 나머지를 보면 w-1과 같다는 특징이 있다.

즉, 개행이 필요한 i값들은 i%w 했을 때 나머지가 w-1일 때라는 것이다.

그말은 즉슨, i%w는 w-1과 같아야 한다.

즉, i%w == w-1일때만 개행을 하는 것이다.

 

따라서, i%w == w-1일 때 println()을 해주면 된다.

그러면 한 줄에 w-1개 만큼 별을 입력할 수 있다.

 

Scanner sc = new Scanner(System.in);
		int n, w;
		// n은 별 개수, w는 한 줄에 들어갈 별의 개수(줄바꿈 위치)

		System.out.println("*를 n개 출력하되 w개마다 줄을 바꿔서 출력합니다.");

		System.out.print("n값: ");
		n = sc.nextInt();
		System.out.print("w값: ");
		w = sc.nextInt();

		for(int i = 0; i < n; i++) {
			System.out.print("*");
			if(i % w == w-1 ) {
				System.out.println();	
			}

		}

 

근데 위 코드는 for문을 돌 때마다 if문을 계속 수행하기 때문에 효율성이 좋지 않다. 좀 더 효율 좋은 코드로 바꾸려면 아래와 같이 작성하면 된다.

for (int i = 0; i < n / w; i++)
			System.out.println("*".repeat(w));

		int rest = n % w;
		if (rest != 0) 
			System.out.println("*".repeat(rest));
	}
}

n/w는 행의 개수를 나타내니까 14/5 = 2 , 2줄을 별 5개씩 출력하게 될거고,

rest라는 변수에 남은 별의 개수를 나타내는 n%w를 저장해서 만약 rest가 0이 아니라면 rest의 수만큼 별을 출력하도록 한다. 

그러면 위 코드와 동일한 결과가 출력된다.