본문 바로가기

programming language/Java

( Java ) 명품자바 p127 - 별찍기

for문을 사용한 별 찍기

 

<풀이 1>

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

		for(int i=0;i<5;i++) {
			for(int j = 5;j-i>0;j--) {
				System.out.print("*");
			}
			System.out.println();
		}
	
	}
}

 

<풀이 2>

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

		for(int i=5;i>0;i--) {
			for(int j = 0;j<i;j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	
	}
}

 

while문을 사용해 별 찍기

 

<오답>

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

	int i =0;
	int j =5;
	while(i<5) {
		while(j-i>0) {
			System.out.print("*");
			j--;
		}
		i++;
		System.out.println();
	     }
    }
}

중첩이 되어있는 while문을 보면 j값이 첫 번째 반복에서 j = 0이 돼버린다. 그래서 그 뒤로 어떤 i값이 와도 조건식 연산에서 0 - i 가돼 버리니 조건에 맞지 않아 반복문을 수행할 수 없는 상태가 돼버리는 것이다. 그렇기 때문에 각 반복마다 j값이 새롭게 초기화될 수 있게끔 해주어야 한다.

 

<정답 코드>

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

		int i;
		i=5;
		while(i>0) {
			int j=0;
			while(j++<i) {
				System.out.print("*");
			}
			i--;
		System.out.println();
	     }
    }
}

중첩된  while문의 조건식을 보면, j++ < i의 식이 있다.

 j++ < i에서, ++(후위 연산자)가 먼저일까? <(대소 비교 연산자)가 우선일까? 언뜻 보면 < 의 연산자가 우선순위가 더 높다라고 생각될 수 있다. 그렇지만 연산자 우선순위는 후위 연산자가 더 높다. 즉 연산을 더 우선적으로 시행한다.

그렇다면 왜 출력 결과가 알맞게 나오는 것일까? 후위 연산자의 기능은 속한 문장을 먼저 진행한 후, 값을 1 증가(선연산, 후 증가). 다시 말해  j를 1 증가하고 증가 전의 값을 반환한다고 보면 될 것 같다.

중첩된 while문의 조건식을 j < i로 하고, j++;을 while문안에 따로 작성해 주어도 된다. 

 

 

do while문을 활용해 별 찍기

 

<오답>

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

		int i;
		i = 5;
		do {
			int j = 0;
			do {
				System.out.print("*");
			}while(j++<i);
			i--;
			System.out.println();
			}while(i>0);
    }
}

System.out.print("*"); 출력문의 위치가 잘못되어, 내가 생각한 별의 개수보다 한 개씩 더 출력이 되는 것을 볼 수 있다.

 

<정답>

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

		int i;
		i = 5;
		do {
			int j = 0;
			while(j++<i)
				System.out.print("*");
			System.out.println();
			i--;
			}while(i>0);
    }
}

do while문의 중첩을 올바르게 사용하였고, 출력문의 위치도 올바른 위치에 있기 때문에 우리가 원하는 출력 결과가 나오게 되었다.