카테고리 없음
능력단위평가 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);
}
}
코드 짜면서 어떻게 해야 더 효율적인 코드를 짤 수 있을지 좀 더 고민해보는 것이 좋을 것 같다.