✅ 답안과 비교하여 스스로 코드 개선점 짚어보기 완료(2021.12.30)
ADVANCED2. ✅
package com.greedy.section02.looping_and_branching.level04.advanced;
import java.util.Scanner;
public class Application2 {
public static void main(String[] args) {
/* 받은 금액을 입력 받고, 상품 가격을 입력 받아 거스름돈을 계산하는 프로그램을 작성하세요
*
* 단, 거스름돈은 대한민국 화폐 단위 별 필요 수량이 출력되도록 작성하고,
* 지폐외 동전을 구분하여 단위를 표기하세요
*
* -- 입력 예시 --
* 받으신 금액을 입력하세요 : 100000
* 상품 가격을 입력하세요 : 22340
*
* -- 출력 예시 --
* ============================
* 50000원권 지폐 1장
* 10000원권 지폐 2장
* 5000원권 지폐 1장
* 1000원권 지폐 2장
* 500원권 동전 1개
* 100원권 동전 1개
* 50원권 동전 1개
* 10원권 동전 1개
* ============================
* 거스름돈 : 77660원
* */
Scanner sc = new Scanner(System.in);
System.out.print("받으신 금액을 입력하세요 : ");
int money = sc.nextInt();
System.out.print("상품 가격을 입력하세요 : ");
int price = sc.nextInt();
int change = money - price;
int currency = 50000;
int mok = 0;
int nmg = 0;
int sw = 0;
int temp = change;
System.out.println("=========================");
while(true) {
mok = temp / currency;
nmg = temp % currency;
if(mok == 0 && nmg == 0) {
break;
}
if(mok != 0) {
if(currency > 500)
System.out.println(currency + "원권 지폐 " + mok + "장");
else
System.out.println(currency + "원권 동전 " + mok + "개");
}
if(sw == 0) {
sw = 1;
currency /= 5;
} else {
sw = 0;
currency /= 2;
}
temp = nmg;
}
System.out.println("=========================");
System.out.println("거스름돈 : " + change + "원");
}
}
ADVANCED1.
package com.greedy.section02.looping_and_branching.level04.advanced;
import java.util.Scanner;
public class Application1 {
public static void main(String[] args) {
/* 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서
* 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다.
*
* A를 3만큼 밀면 D가 되고, z를 1만큼 밀면 a가 됩니다.
* 또한 공백문자는 변경되지 않습니다.
*
* 문자열 1개를 입력 받고, 얼마나 문자를 밀지 알려주는 0보다 큰 정수를 1개 입력 받아
* 암호문을 작성하는 프로그램을 만들어보세요
* 단, 숫자가 27인 경우는 1칸을 밀게 됩니다. (알파벳은 26글자 이기 때문)
*
* -- 입력 예시 --
* 문자열을 입력하세요 : a B z
* 숫자를 입력하세요 : 4
*
* -- 출력 예시 --
* e F d
*
* -- 입력 예시 --
* 문자열을 입력하세요 : a B z
* 숫자를 입력하세요 : 27
*
* -- 출력 예시 --
* b C a
* */
Scanner scanner = new Scanner(System.in);
System.out.print("문자열을 입력하세요 : ");
String abc = scanner.nextLine();
System.out.print("숫자를 입력하세요 : ");
int num = scanner.nextInt();
String result = "";
int mod = num % 26;
for(int i=0; i < abc.length(); i++) {
char ch = abc.charAt(i);
if(ch != ' ') {
if('a' <= ch && ch <= 'z' ) {
if(ch + mod > 'z') {
result += (char)(ch + mod - 26);
} else {
result += (char)(ch + mod);
}
} else {
if(ch + mod > 'Z') {
result += (char)(ch + mod - 26);
} else {
result += (char)(ch + mod);
}
}
} else {
result += ch;
}
}
System.out.println(result);
}
}
HARD3. ✅
break;와 return;의 차이를 알고 활용하자. 여기서 return;은 자신이 속한 for문뿐만 아니라 전체 메인 메소드를 종료하도록 했다. 값을 다시 입력 받아야 하는 조건이 아니므로 첫 번째 for문은 return;을 통해 끝내주는 것이 올바르다.
package com.greedy.section02.looping_and_branching.level03.hard;
import java.util.Scanner;
public class Application3 {
public static void main(String[] args) {
/* 문자열을 하나 입력 받고, 검색할 문자를 입력 하여
* 입력받은 문자열에서 검색할 문자가 몇 개 포함되어 있는지를 출력하는 프로그램을 만드세요
*
* 단, 문자열에 영문자가 아닌 문자가 섞여 있는 경우에는
* 검색할 문자를 입력받지 않고 "영문자가 아닌 문자가 포함되어 있습니다." 출력 후 프로그램을 종료하세요
*
* 또한 일치하는 문자의 경우 대소문자를 구분합니다.
*
* -- 프로그램 예시 --
*
* -- 정상 동작의 경우 --
* -- 입력 예시 --
* 문자열 입력 : apple
* 문자 입력 : p
*
* -- 출력 예시 --
* 포함된 갯수 : 1개
*
* --------------------
* -- 영문자가 아닌 문자 포함된 경우 --
* -- 입력 예시 --
* 문자열 입력 : app2le
*
* -- 출력 예시 --
* 영문자가 아닌 문자가 포함되어 있습니다.
* */
Scanner scanner = new Scanner(System.in);
System.out.print("문자열 입력 : ");
String str = scanner.nextLine();
/* 영문자 확인 */
for(int i=0; i < str.length(); i++) {
char tmp = str.charAt(i);
if(!('a' <= tmp && tmp <= 'z' || 'A' <= tmp && tmp <= 'Z')) {
System.out.println("영문자가 아닌 문자가 포함되어 있습니다.");
return; //break;가 아닌 return;이 올바르다.
}
}
/* 문자 입력 확인 */
System.out.print("문자 입력 : ");
char ch = scanner.next().charAt(0);
int count=0;
for(int i=0; i < str.length(); i++) {
if(ch == str.charAt(i)) {
count++;
}
}
System.out.println("포함된 갯수 : " + count);
}
}
HARD2. ✅
값을 0으로 두기보다는 int count=1;로 시작하는 것이 좋겠다.
특히 count++; 값을 카운팅할 때에 정답 횟수까지 포함되지 않도록 배치하여야 한다.
package com.greedy.section02.looping_and_branching.level03.hard;
import java.util.Scanner;
public class Application2 {
public static void main(String[] args) {
/* 1부터 100 사이의 난수를 발생시키고
* 정수를 입력 받아서 입력받은 정수가 발생한 난수보다 큰 경우 "입력하신 정수보다 큽니다." 출력,
* 입력받은 정수보다 난수가 작은 경우 "입력하신 정수보다 작습니다." 를 출력하며
* 입력한 정수와 난수와 같은 경우까지 난수 맞추기를 반복하는 프로그램을 만드세요.
*
* 단, 입력한 정수와 난수가 같은 경우 "정답입니다. 4회 만에 정답을 맞추셨습니다." 하고
* 정답을 입력한 횟수도 함께 출력되도록 해야 합니다.
* 처음부터 바로 난수를 맞추는 경우는 1회만에 정답을 맞춘 것입니다.
*
* 정답을 맞추는 경우 위 내용을 출력하고 프로그램이 종료되도록 작성하면 됩니다.
*
* -- 프로그램 예시 --
* 정수를 입력하세요 : 5
* 입력하신 정수보다 작습니다.
* 정수를 입력하세요 : 3
* 입력하신 정수보다 큽니다.
* 정수를 입력하세요 : 4
* 정답입니다. 3회만에 정답을 맞추셨습니다.
* */
Scanner scanner = new Scanner(System.in);
int random = (int)(Math.random() * 100) +1;
int count = 0;
while(true) {
System.out.print("정수 입력 : ");
int num= scanner.nextInt();
count++;
if(num == random) {
System.out.println("정답입니다. " + count + "만에 맞히셨습니다.");
break;
} else {
if(num > random) {
System.out.println("입력하신 정수보다 작습니다.");
} else {
System.out.println("입력하신 정수보다 큽니다.");
}
}
}
}
}
HARD1. ✅✅
i < num; 조건식을 <= 같거나 작을 동안으로 설정하면 오류가 생긴다. 반드시 임의 숫자보다 작을 동안만 반복하도록 한다.
잘못 입력했을 때 사용자로부터 값을 다시 입력 받을 while문을 우선 구성하자.
if~else문 안에 for문과 boolean형을 활용해 조건을 따진다.
package com.greedy.section02.looping_and_branching.level03.hard;
import java.util.Scanner;
public class Application1 {
public static void main(String[] args) {
/* 2보다 큰 정수를 하나 입력 받아 그 수가 소수인지 아닌지를 판별해서 출력하세요
* 소수인 경우 "소수다." 출력, 소수가 아닌 경우 "소수가 아니다." 출력
*
* 단, 2보다 큰 정수가 아닌 경우 "잘못 입력하셨습니다. 다시 입력하세요." 라고 출력 후
* 정수를 다시 입력 받을 수 있도록 한다.
*
* 소수란?
* 어떤 수를 1부터 자기 자신까지 차례대로 나누었을 때
* 나누어 떨어지는 수가 1과 자기 자신만 존재하는 수를 소수라고 한다.
*
* -- 입력 예시 --
* 2보다 큰 정수를 하나 입력하세요 : 7
*
* -- 출력 예시 --
* 소수다.
* */
Scanner scanner = new Scanner(System.in);
int num=0;
boolean check = true;
while(true) {
System.out.print("2보다 큰 정수를 하나 입력하세요 : ");
num = scanner.nextInt();
if(num <= 1) {
System.out.println("잘못 입력하셨습니다. 다시 입력하세요.");
} else {
for(int i=2; i < num; i++) {
if(num % i == 0) {
check = false;
break; //for문 종료!
}
}
System.out.println(check ? "소수다." : "소수가 아니다.");
break; //while문 종료!
}
}
}
}
NORMAL3. ✅
초기식은 문제 조건에 따라 1부터 시작하도록 한다. int i=1;
index가 0부터 있기 때문에 i=0;으로 두면 박수박수박으로 순서가 뒤바뀌어 나온다.
package com.greedy.section02.looping_and_branching.level02.normal;
import java.util.Scanner;
public class Application3 {
public static void main(String[] args) {
/* 정수를 입력받아 1부터 입력받은 정수까지
* 홀수이면 "수", 짝수이면 "박"이 정수만큼 누적되어 출력되게 작성하시오.
*
* -- 입력 예시 --
* 정수를 입력하세요 : 5
*
* -- 출력 예시 --
* 수박수박수
* */
Scanner scanner = new Scanner(System.in);
System.out.print("정수를 입력하세요 : ");
int num = scanner.nextInt();
int i=1;
while(i <= num) {
if(i % 2 == 0) {
System.out.print("박");
} else {
System.out.print("수");
}
i++;
}
/* for문 */
// for(int i=1; i <= num; i++) {
// if(i % 2 == 0) {
// System.out.print("박");
// } else {
// System.out.print("수");
// }
// }
}
}
NORMAL2. ✅
A. 아스키코드표를 참고하여 알파벳에 부여된 번호들을 참고할 수 있다.
B. 또는 char형 변수 ch 에 'a'를 선언하고, for(i=0; i < 26, i++)인 동안 (ch++)을 출력할 수 있다.
package com.greedy.section02.looping_and_branching.level02.normal;
public class Application2 {
public static void main(String[] args) {
/* 반복문을 이용하여 알파벳 소문자 'a'부터 'z'까지를 개행 없이 차례로 출력하세요
*
* -- 출력 예시 --
* abcdefghijklmnopqrstuvwxyz
* */
char ch = 'a';
for(int i=ch; i < ch + 25; i++) {
System.out.print((char)i);
}
/* 아스키코드 사용 */
// for(int i=97; 97 <= i && i <= 122; i++) {
// char ch = (char)i;
// System.out.print(ch);
}
}
NORMAL1. ✅
i < str.length();... index 값은 0부터 시작하므로 문자열 길이와 같을 수 없다!
package com.greedy.section02.looping_and_branching.level02.normal;
import java.util.Scanner;
public class Application1 {
public static void main(String[] args) {
/* 문자열을 입력 받아서 문자열의 각 인덱스별로 한 글자씩 출력하세요
*
* 참고) 문자열의 길이는 String 클래스의 length() 메소드를 이용할 수 있습니다.
*
* -- 입력 예시 --
* 문자열을 입력하세요 : apple
*
* -- 출력 예시 --
* 0 : a
* 1 : p
* 2 : p
* 3 : l
* 4 : e
* */
Scanner scanner = new Scanner(System.in);
System.out.print("문자열을 입력하세요 : ");
String str = scanner.nextLine();
for(int i=0; i < str.length(); i++) {
char ch = str.charAt(i);
System.out.println(i + " : " + ch);
}
}
}
BASIC3. ✅
랜덤 값을 입력 받은 int num과 int i 사용처를 잘 구분하여 작성할 수 있도록 한다.
num % 2 !== 0이라는 식은 입력 받은 숫자가 짝수일 동안 반복하는 조건이 된다. 전혀 다른 결과가 나온다.
package com.greedy.section02.looping_and_branching.level01.basic;
import java.util.Scanner;
public class Application3 {
public static void main(String[] args) {
/* 1부터 입력받은 정수까지의 짝수의 합을 구하세요
*
* -- 입력 예시 --
* 정수를 입력하세요 : 10
*
* -- 출력 예시 --
* 1부터 10까지 짝수의 합 : 30
* */
Scanner scanner = new Scanner(System.in);
System.out.print("정수를 입력하세요 : ");
int num = scanner.nextInt();
int sum=0;
for(int i=1; i <= num; i++) {
if(i % 2 != 0) {
continue;
} else {
sum += i;
}
}
System.out.println("1부터 " + num + "까지의 합 : " + sum);
}
}
BASIC2. ✅
package com.greedy.section02.looping_and_branching.level01.basic;
import java.util.Scanner;
public class Application2 {
public static void main(String[] args) {
/* 정수 한 개를 입력 받고, 1부터 입력 받은 정수까지의 합을 계산해서 출력하세요
*
* -- 입력 예시 --
* 정수를 입력하세요 : 5
*
* -- 출력 예시 --
* 1부터 5까지의 합 : 15
*
* */
Scanner scanner = new Scanner(System.in);
System.out.print("정수를 입력하세요 : ");
int num = scanner.nextInt();
int sum=0;
for(int i=1; i <= num; i++) {
sum += i;
}
System.out.println("1부터 " + num + "까지의 합 : " + sum);
}
}
BASIC1. ✅
package com.greedy.section02.looping_and_branching.level01.basic;
public class Application1 {
public static void main(String[] args) {
/* 1부터 10까지 합계를 구하고 결과를 출력하세요
*
* -- 출력 예시 --
* 1부터 10까지의 합 : 55
* */
int sum=0;
for(int i=1; i <= 10; i++) {
sum += i;
}
System.out.println("1부터 10까지의 합 : " + sum);
}
}
'Java' 카테고리의 다른 글
[JAVA] 5-1. 배열의 선언, 할당, 초기화 (0) | 2021.12.27 |
---|---|
[자바의 정석] Ch 4. 제어문 예제 응용 학습 (0) | 2021.12.26 |
[자바의 정석] Ch 4. 제어문 연습문제 풀이 (0) | 2021.12.25 |
[자바의 정석] Ch 3. 연산자 예제 응용 학습 (0) | 2021.12.25 |
[자바의 정석] Ch 3. 연산자 연습문제 풀이 (0) | 2021.12.25 |