Programing_Java

Project#1 _ Team Project No.1 본문

Projects

Project#1 _ Team Project No.1

Joyfullyever 2024. 12. 31. 16:01

#1 Project 문제

 

정수를 2개 입력하고, 정수1~정수2 사이의 랜덤수를 3개 출력. 단, 랜덤 숫자끼리는 중복되어서는 안된다.

 

#2 문제 해석 → 한글 코딩


/*
정수1, 정수2를 입력받으려고 스캐너 변수 선언 
난수를 생성하기 위해 랜덤 변수 선언

범위를 구하기 위한 변수 정수1, 정수2 선언 
        
아래 명령 계속 반복{
사용자 입력 메시지 출력
정수1 입력
사용자 입력 메시지 출력
정수2 입력

{만약 정수1과 정수2 차의 절댓값이 2미만인 경우 
   오류메시지 "정수를 다시 입력해주세요" 출력 후 
   다시 사용자 입력 받음}
{만약 정수1과 정수2 차의 절댓값이 2이상 이라면
   반복하지 않음}
}
//교환 알고리즘
{만약 정수1이 정수2보다 크면 정수1과 정수2의 값을 교환
   임시변수에 정수1 대입
   정수1에 정수2 대입
   임시변수에 저장한 정수를 정수2에 대입}
            
상수화 랜덤갯수 = 정수2 - 정수1 + 1

난수1 선언 및 초기화 = (상수화 시킨 랜덤갯수) + 더 작은수(시작값)
난수2 선언
난수3 선언

   	
아래 명령 계속 실행{
   난수2 = (상수화 시킨 랜덤갯수) + 더 작은수(시작값)
   {만약 난수1과 난수2가 다르면
      종료}
아래 명령 계속 실행
   난수3 = (상수화 시킨 랜덤갯수) + 더 작은수(시작값)
   {만약 난수1과 난수3이 다르고 난수2와 난수3이 다르면
      종료}

난수1, 난수2, 난수3 출력
*/

#3 코드 작성


public static void main(String[] args) {

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

// 정수1값, 정수2값선언
   int num1;
   int num2;

// 알맞는 정수를 입력할때 까지 반복 하는 while문
   while (true) {
       System.out.print("1번 정수 입력 >>> ");
       // 1번 정수 입력 받고 num1에 저장
       num1 = sc.nextInt();
       System.out.print("2번 정수 입력 >>> ");
       // 2번 정수 입력 받고 num2에 저장
       num2 = sc.nextInt();

// 만약 정수1-정수2를 한 값이 -2보다 크고, 2보다 작다면
   if (-2 < num1 - num2 && num1 - num2 < 2) {
       System.out.println("범위가 2 미만입니다. 다시 입력해주세요.");
 // 다시 처음부터 입력 받기 위해 while문의 맨 처음으로 이동
       continue;
   } else
       break;
}

// 만약 정수1이 정수2보다 크다면
   if (num1 > num2) {
// 임시 저장변수에 num1값 저장
   int temp = num1;
   num1 = num2;
   num2 = temp;
}

// 랜덤수1은 정수2-정수1을 하고 다시 1을 더하여 범위를 설정하고, 시작점을 num1으로 지정
   int r1 = r.nextInt((num2 - num1) + 1) + num1;
   int r2;
   int r3;

// 랜덤수2가 뽑힐 떄 까지 도는 while문
   while (true) {
   // 랜덤수1과 동일
        r2 = r.nextInt((num2 - num1) + 1) + num1;
   // 만약 r1과 r2가 같지 않다면
        if (r1 != r2) {
        break;
        }
   }
// 랜덤수3이 뽑힐 떄 까지 도는 while문
   while (true) {
   // 랜덤수3과 동일
        r3 = r.nextInt((num2 - num1) + 1) + num1;
        // 만약 r1과 r3가 다르고, r2와 r3가 다르다면
        if (r1 != r3 && r2 != r3) {
        break;
        }
}
   System.out.println(r1 + ", " + r2 + ", " + r3);

   // 정수값을 입력받기 위해 import한 스캐너 사용 종료
   sc.close();
}

#4 출력값

 


1번 정수 입력 >>> Ex) 1
2번 정수 입력 >>> Ex) 2
범위가 2 미만입니다. 다시 입력해주세요.
1번 정수 입력 >>> Ex) 0
2번 정수 입력 >>> Ex) 9
6, 2, 9

#5 Feedback

1. 상수화

: 기존 사용 코드

((num2-num1)+1)로 랜덤 함수의 갯수를 정하고, 해당 내용을 반복

    → 긴 문장을 다시 반복해서 작성하지 않도록, 상수화를 통해서 코드를 더욱 간소화


final int ranrange = num2 - num1 + 1 ;

2. While문을 사용할때는 항상 종료조건을 우선해서 사용

: 기존 사용 코드

   while (true) {
       System.out.print("1번 정수 입력 >>> ");
       num1 = sc.nextInt();
       System.out.print("2번 정수 입력 >>> ");
       num2 = sc.nextInt();

		if (-2 < num1 - num2 && num1 - num2 < 2) {
        	System.out.println("범위가 2 미만입니다. 다시 입력해주세요.");
            continue;
   } //if로 끝내지말고 해당 주석과 같은 줄에 조건 Ex) else를 걸어주어 종료조건을 만들기
   		break;
	}