카테고리 없음

능력단위평가 1 복습 : 정수 2개 입력받아 랜덤수 구하기

_KH_ 2025. 1. 19. 22:41

※ 문제

[정수를 2개 입력합니다.
정수1~정수2 사이의 랜덤수를 3개 출력해주세요.
단, 랜덤숫자끼리는 중복되어서는 안됩니다!]

 

※ 한글코딩

		스캐너 객체 선언
		랜덤 객체 선언

		무한루프 {
			정수 A, B를 입력하세요 ! 출력
			정수형 변수 A = 스캐너.정수형
			사용자에게 입력받음
			정수형 변수 B = 스캐너.정수형
			사용자에게 입력받음
			/* 정수 2개의 조건
		1. 같으면 안됨
		2. A가 B보다 작아야 함
		3. 둘의 차이가 2 이상이어야 함
			 */
			만약(A가 B보다 크다면) {
				임시 저장 변수 tmp 선언
				tmp에 A의 값을 넣어놓고
				A에 B값을 넣음
				B에는 저장해놨던 tmp를 넣음(A값)
				// 교환로직
			}
			그게 아니고 (A와 B가 같다면) {
				다시 입력해주세요! 출력
				사용자 입력으로 돌아감
			}
			종료조건
			만약(A가 B보다 작고, 둘의 차이가 2 이상 나면 )
			반복문 탈출!
		}


		랜덤 = 랜덤변수.(B-A+1)+A // 범위 설정
				정수형 변수 NUM1 = 랜덤수 중 뽑기

			언제 중복되지 않는 수를 뽑을지 모르니 무한루프
				무한루프 {
					정수형 변수 NUM2 = 랜덤수 중 뽑기
					만약(NUM이 NUM1과 다르면) {
						탈출
				}
					
			언제 중복되지 않는 수를 뽑을지 모르니 무한루프
				무한루프 {	
					정수형 변수 NUM3 = 랜덤수 중 뽑기
					만약(NUM3이 NUM1과 다르고 NUM3이 NUM2와 다르면) {
						탈출
					} // 겹치지 않을 때까지 반복해야 함. 
			}
	
		}

작성하다보니 알았는데 a와 b가 2 미만으로 차이날 때 조건 안넣었음. 코드 짜면서 추가했다

 

※ 코드 작성

package practice;

import java.util.Random;
import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		Random rand = new Random();

		int a, b;

		while(true) {

			System.out.println("정수 a, b를 입력하세요!");
			System.out.print("a의 값 >> ");
			a = sc.nextInt();
			System.out.print("b의 값 >> ");
			b = sc.nextInt();

			if(a>b) {
				int tmp = a;
				a = b;
				b = tmp;
			}
			else if(a == b) {
				System.out.println("두 수가 같습니다! 다시 입력해주세요!");
				continue;
			}
			else if(a+2>b) { // a와 b의 차이가 2이상이 아닐 때
				System.out.println("두 수의 차이가 너무 작습니다. 다시 입력해주세요!");
				continue;
			}

			if(a < b && a + 2 <= b) {
				break;
			}
		}
		
		System.out.println("a의 값 : " + a);
		System.out.println("b의 값 : " + b);

		int num1, num2, num3;
		
		num1 = rand.nextInt(b-a+1)+a;

		while(true) {
			num2 = rand.nextInt(b-a+1)+a;
			if(num2 != num1) {
				break;
			}
		}
		
		while(true) {
			num3 = rand.nextInt(b-a+1)+a;
			if(num3 != num1 && num3 != num2) {
				break;
			}
		}
		System.out.println("랜덤 수 1 : " + num1);
		System.out.println("랜덤 수 2 : " + num2);
		System.out.println("랜덤 수 3 : " + num3);
	}
}

 

			if(a>b) {
				int tmp = a;
				a = b;
				b = tmp;
			}
			else if(a == b) {
				System.out.println("두 수가 같습니다! 다시 입력해주세요!");
				continue;
			}
			else if(a+2>b) { // a와 b의 차이가 2이상이 아닐 때
				System.out.println("두 수의 차이가 너무 작습니다. 다시 입력해주세요!");
				continue;
			}

이렇게 작성했는데

1. 값이 같은 경우를 먼저 검사하고,

2. a가 b보다 더 큰 경우를 검사하고,

3. a와 b가 2 이상 차이가 나는지 검사하는 것이 더 논리적이고 효율적인 코드인 것 같다.

 

그래서 수정하였다.

package practice;

import java.util.Random;
import java.util.Scanner;

public class Test01 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		Random rand = new Random();

		int a, b;

		while(true) {

			System.out.println("정수 a, b를 입력하세요!");
			System.out.print("a의 값 >> ");
			a = sc.nextInt();
			System.out.print("b의 값 >> ");
			b = sc.nextInt();

			
			if(a == b) {
				System.out.println("두 수가 같습니다! 다시 입력해주세요!");
				continue;
			}
			if(a>b) {
				int tmp = a;
				a = b;
				b = tmp;
			}
			else if(a+2>b) { // a와 b의 차이가 2이상이 아닐 때
				System.out.println("두 수의 차이가 너무 작습니다. 다시 입력해주세요!");
				continue;
			}

			if(a < b && a + 2 <= b) {
				break;
			}
		}
		
		System.out.println("a의 값 : " + a);
		System.out.println("b의 값 : " + b);

		int num1, num2, num3;
		
		num1 = rand.nextInt(b-a+1)+a;

		while(true) {
			num2 = rand.nextInt(b-a+1)+a;
			if(num2 != num1) {
				break;
			}
		}
		
		while(true) {
			num3 = rand.nextInt(b-a+1)+a;
			if(num3 != num1 && num3 != num2) {
				break;
			}
		}
		System.out.println("랜덤 수 1 : " + num1);
		System.out.println("랜덤 수 2 : " + num2);
		System.out.println("랜덤 수 3 : " + num3);
	}
}

 

출력결과

 

 

코드 짜면서 어떻게 해야 더 효율적인 코드를 짤 수 있을지 좀 더 고민해보는 것이 좋을 것 같다.