코드 그라데이션

배열 출력(숫자야구) i+1을 하는 이유 chat GPT 본문

Java/Mega

배열 출력(숫자야구) i+1을 하는 이유 chat GPT

완벽한 장면 2023. 3. 27. 15:25

Q. 지금

여기서 왜 (i+1)+"번째 숫자 인거야? 즉, i에 +1을 해서 출력하는 이유?

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Random r = new Random();
		Scanner sc = new Scanner(System.in);

		int[] com = new int[3];
		int[] user = new int[3];

		for(int i = 0;i<com.length;i++) {
			com[i] = r.nextInt(9)+1;   // 예를 들면 com[0] = 8 com[1] = 7 com[2] = 7
			for(int j = 0;j<i;j++) {
				if(com[i] == com[j]) {
					i--; // i의 값을 변동시켜 com[i]에 계속 다른 값을 넣기 위함. 결국 i가 3이 되고 [0], [1], [2]의 값이 모두 다르면 탈출함.
					break;
				}
			}
		}
		System.out.println(com[0]+","+com[1]+","+com[2]);

		int strike = 0;
		int ball = 0;

		while(strike < 3) {
			for(int i = 0;i<user.length;i++) {
				System.out.print((i+1)+"번째 숫자 : ");
				user[i] = sc.nextInt();
				//범위 1~9 아닌경우
				if(user[i]<1 || user[i] >9) {
					System.out.println("잘못된 입력입니다.");
					i--;
					continue;
					// 그 값만 보면 되기 때문에 반복문 안 쓴다.
				}
				//값이 중복되는 경우
				for(int j = 0;j<i;j++) { // 일일이 확인해줘야 하기 때문에 밤복문 출력
					if(user[i] == user[j]) {
						System.out.println("잘못된 입력입니다.");
						i--;
						break;
					}
				}
			}

 

A.

(i+1)을 사용해서 출력하는 이유는 사용자에게 보여주는 번호를 1부터 시작하도록 하기 위함입니다.

 

배열은 0부터 인덱스가 시작하기 때문에, 만약 숫자를 입력할 때 i를 그대로 사용한다면,

사용자는 0번째, 1번째, 2번째 숫자를 입력한다는 것을 인식할 것입니다.

 

하지만 i에 1을 더해서 출력하면, 사용자는 1번째, 2번째, 3번째 숫자를 입력하고 있다고 인식할 수 있습니다.

이는 사용자의 편의를 위해 출력 숫자를 1부터 시작하도록 만들기 위함입니다.

 

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

 

Q.

그럼 왜 위 for문에서는 continue; 를 쓰고, 아래 for문에서는 break;를 쓰는 거야?

 

A.

위 for문에서 continue를 사용한 이유는,

잘못된 입력이 들어왔을 경우에는 해당 입력을 무시하고 다시 사용자로부터 입력을 받아야하기 때문입니다.

 

예를 들어, 사용자가 0이나 10과 같이 범위를 벗어나는 값을 입력하거나, 중복된 값을 입력하면,

해당 입력을 무시하고 다시 사용자로부터 값을 입력받아야합니다.

따라서 continue를 사용해서 해당 입력을 무시하고 다음 반복문으로 이동하여, 새로운 값을 입력받도록 합니다.

 

반면에 아래 for문에서 break를 사용한 이유는,

중복된 값을 입력했을 경우에는 해당 반복문에서 더 이상 검사할 필요가 없기 때문입니다.

 

중복된 값이 하나라도 있다면, 다시 사용자로부터 값을 입력받기 위해 상위 for문으로 이동해야 하기 때문에,

break를 사용해서 해당 반복문을 빠져나와 상위 for문으로 이동하도록 합니다.

 

-----------

 

Q. 

그럼 지금 내가 좀 헷갈리는게, j를 쓰는 for문이 i를 쓰는 for문 안에 들어있는 중첩 for문인가?

 

A.

맞습니다. j를 사용하는 for문은 i를 사용하는 for문 내부에 중첩된 반복문입니다.

 

i를 사용하는 for문은 com 배열과 user 배열의 인덱스를 순차적으로 접근하여 값을 입력받습니다.

 

그리고 j를 사용하는 for문은,

i가 입력받은 값의 중복 여부를 확인하기 위해, 이전에 입력된 값들을 비교하기 위해 사용됩니다.

 

따라서 j를 사용하는 for문은 i를 사용하는 for문의 내부에 위치하게 됩니다.

 

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

 

Q. "반면에 아래 for문에서는 break를 사용한 이유는, 중복된 값을 입력했을 경우에는 해당 반복문에서 더 이상 검사할 필요가 없기 때문입니다. " 이거 말인데, 왜 검사할 필요가 없어?

 

A.

중복된 값을 입력한 경우에는 이미 이전에 입력된 값과 중복된 값이므로, 해당 값은 다시 검사할 필요가 없습니다.

이는 이후에 이 값이 스트라이크인지 볼인지를 판별하는 과정에서도 마찬가지입니다.

 

예를 들어, 사용자가 3, 4, 4를 입력했을 경우에는

이전에 입력된 3과 중복된 값이 아니므로, 다음 값인 4를 검사합니다.

 

그런데 4가 다시 한 번 입력되었으므로,

이후에 이 값이 스트라이크인지 볼인지를 판별하는 과정에서도 이미 중복된 값이므로 다시 검사할 필요가 없습니다.

 

따라서, 해당 for문에서는 break를 사용해서 반복문을 빠져나와 다음 값으로 이동할 수 있도록 합니다.

 

728x90
Comments