KDT/Java

231108 Java - 탐욕 알고리즘, 조건문 2

001cloudid 2023. 11. 8. 17:39
728x90

탐욕 알고리즘(Greedy algorithm)

여러 경우 중에서 하나를 결정해야할 때마다 그 순간에 최적이라고 생각되는 것을 선택해 나가는것

 

// 금액을 입력받아 화폐단위대로 분리해서 표시(5만원권, 1만원권, 5천원권, 1천원권) (단,  / ,  % 만 사용할 것)
// 187,000원을 입력받아서다면 5만원권 3장, 1만원권 3장, 5천원권 1장, 1천원권 2장.

System.out.println("금액을 입력하세요.");
int price = sc.nextInt();
System.out.println("입력받은 금액 " + price);

int oman = price/50000;
int ilman = (price%50000)/10000;
int ochun = ((price%50000)%10000)/5000;
int ilchun = (((price%50000)%10000)%5000)/1000;

System.out.println("5만원권 " + oman + "장");
System.out.println("1만원권 " + ilman + "장");
System.out.println("5천원권 " + ochun + "장");
System.out.println("1천원권 " + ilchun + "장");

 

ex1 결과
그림 1. ex1 결과

 

//금액을 입력받아 화폐, 동전을 분리해서 표시
System.out.println("금액을 입력하세요.");
int m = sc.nextInt();

int money50000 = money /50000;
int money10000 = money%50000/10000;
int money5000 = money%50000%10000/5000;
int money1000 = money%50000%10000%5000/1000;
int money500 = money%50000%10000%5000%1000/500;
int money100 = money%50000%10000%5000%1000%500/100;
int money50 = money%50000%10000%5000%1000%500%100/50;
int money10 = money%50000%10000%5000%1000%500%100%50/10;

System.out.println("5만원 " + money50000 + "장");
System.out.println("1만원 " + money10000 + "장");
System.out.println("5천원 " + money5000 + "장");
System.out.println("1천원 " + money1000 + "장");
System.out.println("5백원 " + money500 + "개");
System.out.println("1백원 " + money100 + "개");
System.out.println("5십원 " + money50 + "개");
System.out.println("1십원 " + money10 + "개");

 

ex2 결과
그림 2. ex2 결과

 

조건문

if-else 문

//나이가 8세 이상이면 학교에 다닌다 그렇지 않으면 학교에 다니지 않는다.

int age = 7;
if (age >= 8) {
System.out.println("학교에 다닙니다.");
} else {
System.out.println("학교에 다니지 않습니다.");
}

 

ex3 결과
그림 2. ex3 결과

 

if else if else문

조건이 여러개인 경우 맞는 조건을 수행하고 끝내는 구문이다.
형식 if(조건식){조건이 참일 때 수행할 내용}

else if(조건식) {조건이 참일 때 수행할 내용}

else {물어보지 않는 모든 조건 수행 내용}

 

int age = 9;
int charge;
if(age<8){
charge=1000;
System.out.println("취학 전 아동");
} else if(age<14) {
charge=2000;
System.out.println("초등학생");
} else if(age<20) {
charge=2500;
System.out.println("중˙고등학생");
} else {
charge=3000;
System.out.println("일반인");}
System.out.println("요금은 "+ charge +"원 입니다.");

 

ex4 결과
그림 4. ex4 결과

 

//키보드로 입력받아서 출력

System.out.println("나이를 입력하세요.");
int age = sc.nextInt();
int charge;
if(age<8){
charge=1000;
System.out.println("취학 전 아동입니다.");
} else if(age<14) {
charge=2000;
System.out.println("초등학생입니다.");
} else if(age<20) {
charge=2500;
System.out.println("중˙고등학생입니다.");
} else {
charge=3000;
System.out.println("일반인입니다.");
}
System.out.println("요금은 "+ charge +"원 입니다.");
//이 경우 음수나 1000을 입력해도 값이 입력된다.

//수정 : 나이가 0살미만과 150살 이상일 경우 "나이를 잘 못 입력하였습니다."라고 출력되게해보자

System.out.println("나이를 입력하세요.");
int age = sc.nextInt();
int charge = 0;
if((age>0) && (age<=7)){
charge=1000;
System.out.println("취학 전 아동입니다.");
} else if((age>=8) && (age<=13)) {
charge=2000;
System.out.println("초등학생입니다.");
} else if((age>=14) && (age<=19)) {
charge=2500;
System.out.println("중˙고등학생입니다.");
} else if((age>=20) && (age<=150)){
charge=3000;
System.out.println("일반인입니다.");
} else  {
System.out.println("나이를 잘못 입력하였습니다.");
}
System.out.println("요금은 "+ charge +"원 입니다.");

 

ex5 수정 결과
그림 5. 수정 결과

 

//95점 이상 A+, 90점 이상 A, 85점 이상 B+, 80점 이상 B, 70점 이상 C, 60점이상 D, 나머지 점수 "재시험"

int score = sc.nextInt();
String grade="";
if (score>=95 && score<101) {
grade = "A+";
} else if(score>=90 && score<95) {
grade = "A";
} else if(score>=85 && score<90) {
grade = "B+";
} else if(score>=80 && score<85) {
grade = "B";
} else if(score>=70 && score<80) {
grade = "C";
} else if(score>=60 && score<70) {
grade = "D";
} else if (score>=0 && score<60){
grade = "재시험";
} else {
grade = "점수를 잘못 입력하였습니다.";
}
System.out.println(grade);

 

ex6 결과
그림 6. 결과

연산자가 있을 때 괄호로 묶어주는 습관

 

//혈액형

System.out.println("혈액형을 입력해주세요");
char blood = sc.next().charAt(0);
if (blood == 'A') {
System.out.println("A형");;
} else if (blood=='B') {
System.out.println("B형");;
} else if (blood=='O') {
System.out.println("O형");
} else {
System.out.println("AB형");}

 

ex8 결과
그림 7. 혈액형 결과

문제가 생긴다. 수정을하면 아래와 같다.

System.out.println("혈액형을 입력해주세요");
String blood = sc.nextLine();
if (blood.equals("A")) {
System.out.println("A형");;
} else if (blood.equals("B")) {
System.out.println("B형");;
} else if (blood.equals("O")) {
System.out.println("O형");
} else {
System.out.println("AB형");}

 

ex8 수정
그림 8. 혈액형 수정

 

ex8 문제점
그림 9. 혈액형 문제점

이러한 문제점이 발생하는데 다시 재수정하면

System.out.println("혈액형을 입력해주세요");
String blood = sc.nextLine();
if (blood.equals("A")) {
System.out.println("A형");;
} else if (blood.equals("B")) {
System.out.println("B형");;
} else if (blood.equals("O")) {
System.out.println("O형");
} else if (blood.equals("AB")) {
System.out.println("AB형");
} else {
System.out.println("혈액형을 잘못입력하였습니다.");}

 

ex8 재수정
그림 10. 혈액형 재수정

여기서 또 문제점이 발생하는 데 그림 11과 같다

ex8 재수정 문제점
그림 11. 혈액형 재수정 문제점

 

System.out.println("혈액형을 입력해주세요");
String blood = sc.nextLine();
if ((blood.equals("A")) || (blood.equals("a"))) {
System.out.println("A형");;
} else if ((blood.equals("B")) || (blood.equals("b"))) {
System.out.println("B형");;
} else if ((blood.equals("O")) || (blood.equals("o"))) {
System.out.println("O형");
} else if ((blood.equals("AB")) || (blood.equals("ab"))) {
System.out.println("AB형");
} else {
System.out.println("혈액형을 잘못입력하였습니다.");
}

// 또는
System.out.println("혈액형을 입력해주세요");
String blood = sc.nextLine();
String str;
if ((blood.equals("A")) || (blood.equals("a"))) {
str = "A형";
} else if ((blood.equals("B")) || (blood.equals("b"))) {
str = "B형";
} else if ((blood.equals("O")) || (blood.equals("o"))) {
str = "O형";
} else if ((blood.equals("AB")) || (blood.equals("ab"))) {
str = "AB형";
} else {
str = "잘못 입력하였습니다.";}
System.out.println(str);

 

ex8 재재수정
그림 12. ex8 재재수정

 

중첩 if문

if문 내에 if문으로 구성. 처음 if문의 조건이 맞지 않으면 if문 내의 if문을 수행하지 않는다.

if문이 참이어야 if문 안 if문이 수행 가능 대표적인 예로는 id가 맞아야 pw를 입력할 수 있는 것이 있다.

//
int math = 70;
int eng = 55;
if(math>=70) {
if(eng>=60) {
System.out.println("pass");
}
else {
System.out.println("fail");}
}
//fail이 출력

// 로그인 예제 id:abcde, pw:12345

String id, pw;
System.out.println("ID를 입력하세요");
id = sc.nextLine();

if(id.equals("abcde")) {
System.out.println("ID가 일치합니다.");

System.out.println("PW를 입력하세요");
pw = sc.nextLine();

if(pw.equals("12345")) {
System.out.println("비밀번호가 일치합니다.");
System.out.println("로그인 성공");
} 
else  {
System.out.println("비밀번호가 틀립니다.");
}
} else {
System.out.println("ID를 확인해주세요.");
}

 

ex10 결과
그림 13. 로그인 예제 결과

 

728x90

'KDT > Java' 카테고리의 다른 글

231113 Java  (0) 2023.11.13
231109 Java - 조건문3  (0) 2023.11.09
231106 Java - 연산자 2, 조건문 1  (0) 2023.11.06
231102 Java - 연산자 1  (0) 2023.11.02
231101 Java - Scanner 클래스 2  (0) 2023.11.01