Skip to content

Commit ff8bd86

Browse files
authored
Add files via upload
1 parent 961a5f7 commit ff8bd86

File tree

9 files changed

+436
-0
lines changed

9 files changed

+436
-0
lines changed

week02/advanced/Account.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package week02.advanced;
2+
3+
public class Account {
4+
5+
private String owner;
6+
private int balance;
7+
8+
Account(String owner, int balance){
9+
this.owner = owner;
10+
this.balance = balance;
11+
12+
}
13+
14+
boolean transfer(Account target, int amount){
15+
if (balance >= amount) {
16+
this.balance -= amount; // 잔액 -이체금액
17+
target.balance += amount; // target 잔액 + 이체금액
18+
return true;
19+
}
20+
return false;
21+
}
22+
23+
public String getOwner() {
24+
return owner;
25+
}
26+
27+
public int getBalance() {
28+
return balance;
29+
}
30+
31+
32+
// 27단계 (심화): 은행 계좌 이체 트랜잭션
33+
// 문제: Account.java (계좌주 owner, 잔액 balance)에, 다른 Account 객체와 이체할 금액을
34+
// 매개변수로 받아 계좌 이체를 수행하는 transfer(Account target, int amount)메서드를
35+
// 구현하세요. 이체에 성공하면 true, 잔액 부족으로 실패하면 false를 리턴하도록 만드세요.
36+
// Bank.java에서 두 계좌를 만들고,이체 메서드를 호출한 뒤 리턴값에 따라 "이체 성공" 또는 "이체 실패"
37+
// 를 출력하세요.
38+
// 핵심 사고: 두 객체가 상호작용하며 서로의 상태를 변경하고, 작업의 성공/실패 여부를 리턴값으로 알려주는
39+
// 트랜잭션 개념을 구현합니다.
40+
// 힌트: 객체 간 상호작용, 메서드 리턴값(boolean), if문, private, getter, setter
41+
42+
}

week02/advanced/Bank.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package week02.advanced;
2+
3+
public class Bank {
4+
5+
public static void main(String[] args) {
6+
System.out.println("<은행 계좌 이체 트랜잭션>");
7+
// 27단계 (심화): 은행 계좌 이체 트랜잭션
8+
// 문제: Account.java (계좌주 owner, 잔액 balance)에, 다른 Account 객체와 이체할 금액을
9+
// 매개변수로 받아 계좌 이체를 수행하는 transfer(Account target, int amount)메서드를
10+
// 구현하세요. 이체에 성공하면 true, 잔액 부족으로 실패하면 false를 리턴하도록 만드세요.
11+
// Bank.java에서 두 계좌를 만들고,이체 메서드를 호출한 뒤 리턴값에 따라 "이체 성공" 또는 "이체 실패"
12+
// 를 출력하세요.
13+
// 핵심 사고: 두 객체가 상호작용하며 서로의 상태를 변경하고, 작업의 성공/실패 여부를 리턴값으로 알려주는
14+
// 트랜잭션 개념을 구현합니다.
15+
// 힌트: 객체 간 상호작용, 메서드 리턴값(boolean), if문, private, getter, setter
16+
Account a = new Account("김학생", 123); // 만원 단위
17+
Account b = new Account("엄마", 500);
18+
Account c = new Account("아빠", 8000);
19+
20+
boolean sucess = b.transfer(a, 10);
21+
System.out.print(b.getOwner() + "님이 " + a.getOwner() + "님 계좌로 10만원 ");
22+
System.out.println(sucess ? "이체 성공 하였습니다." : "이체 실패 하였습니다.");
23+
System.out.print(b.getOwner() + "님의 잔액은 " + b.getBalance() + "만원 남았습니다. ");
24+
System.out.println(a.getOwner() + "님의 잔액은 " + a.getBalance() + "만원 남았습니다.");
25+
System.out.println();
26+
27+
sucess = a.transfer(c,134);
28+
System.out.print(a.getOwner() + "님이 " + c.getOwner() + "님 계좌로 10만원 ");
29+
System.out.println(sucess ? "이체 성공 하였습니다." : "이체 실패 하였습니다.");
30+
System.out.print(a.getOwner() + "님의 잔액은 " + a.getBalance() + "만원 남았습니다. ");
31+
System.out.println(c.getOwner() + "님의 잔액은 " + c.getBalance() + "만원 남았습니다.");
32+
}
33+
34+
}

week02/advanced/Drink.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package week02.advanced;
2+
3+
public class Drink {
4+
5+
private String name;
6+
private int price;
7+
private int stock;
8+
9+
Drink(String name, int price, int stock){
10+
this.name = name;
11+
this.price = price;
12+
this.stock = stock;
13+
}
14+
15+
public String getName() {
16+
return name;
17+
}
18+
public void setName(String name) {
19+
this.name = name;
20+
}
21+
public int getPrice() {
22+
return price;
23+
}
24+
public void setPrice(int price) {
25+
this.price = price;
26+
}
27+
public int getStock() {
28+
return stock;
29+
}
30+
public void setStock(int stock) {
31+
this.stock = stock;
32+
}
33+
34+
}
35+
// 30단계 (심화): 자판기 시스템의 완성
36+
// 문제:
37+
// 1. Drink.java: 이름(name), 가격(price), 재고(stock)를 private 멤버와
38+
// Getter/Setter로 가집니다.
39+
// 2. VendingMachine.java: Drink 객체 배열(drinks)과 투입된 금액(money)을
40+
// 멤버로 가집니다. 음료를 세팅하는 setupDrinks() 메서드, 돈을 투입하는 insertMoney(int m),
41+
// 음료를 선택하는 selectDrink(int index) 메서드를 구현하세요. selectDrink는 성공 시
42+
// 거스름돈, 재고 부족 시 -1, 금액 부족 시 -2를 리턴합니다.
43+
// 3. VendingMachineTest.java에서 자판기를 만들고, while 루프를 통해 사용자 상호작용
44+
// (돈 투입, 음료 선택)을 시뮬레이션하세요. selectDrink의 리턴값에 따라 다른 메시지를
45+
// 출력해야 합니다.
46+
// 핵심 사고: 여러 클래스와 복잡한 상태(재고, 돈)를 종합적으로 관리하며, 메서드의 다양한 리턴값을 통해
47+
// 프로그램의 흐름을 제어하는 완성도 높은 프로그램을 설계합니다.
48+
// 힌트: 종합적인 클래스 설계, 상태 관리, 메서드 리턴값을 이용한 로직 분기, while문,
49+
// if-else if-else, input

week02/advanced/MathUtil.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package week02.advanced;
2+
3+
public class MathUtil {
4+
5+
static int fibonacci(int n) {
6+
if (n == 0) {
7+
return 0;
8+
}
9+
if (n == 1) {
10+
return 1;
11+
}
12+
return fibonacci(n-1) + fibonacci(n-2);
13+
}
14+
15+
16+
public static void main(String[] args) {
17+
System.out.println("<재귀 호출을 이용한 피보나치 수열>");
18+
// 28단계 (심화): 재귀 호출을 이용한 피보나치 수열
19+
// 문제: MathUtil.java 클래스에 숫자를 하나 받아 피보나치 수열의 n번째 항을 리턴하는
20+
// static int fibonacci(int n) 메서드를 구현하세요. 단, for문이나 while문이 아닌 재귀 호출을
21+
// 사용해야 합니다. (F(n) = F(n-1) + F(n-2), F(1)=1, F(2)=1)
22+
// 핵심 사고: 반복문을 클래스의 메서드와 재귀 호출로 해결하는 다른 접근법을 경험합니다.
23+
// 힌트: 재귀 호출, static 메서드, if문 (종료 조건), return
24+
System.out.println("F(0): " + fibonacci(0));
25+
System.out.println("F(1): " + fibonacci(1));
26+
System.out.println("F(8): " + fibonacci(8));
27+
System.out.println("F(15): " + fibonacci(15));
28+
}
29+
30+
}

week02/advanced/SnailArray.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package week02.advanced;
2+
3+
public class SnailArray {
4+
5+
int[][] array;
6+
7+
SnailArray(int N){
8+
array = new int [N][N];
9+
10+
int x = 0, y = 0, dir = 0;
11+
int [] dx = {0, 1, 0, -1}; // 행(오른쪽 아래 왼쪽 위)
12+
int [] dy = {1, 0, -1, 0}; // 열(오른쪽 아래 왼쪽 위)
13+
14+
for (int i = 0; i < N * N; i++) {
15+
array[x][y] = i+1;
16+
17+
int nx = x + dx[dir]; // 다음 행
18+
int ny = y + dy[dir]; // 다음 열
19+
20+
boolean outOfRange = (nx < 0 || nx >= N || ny < 0 || ny >= N); // 범위밖
21+
boolean filled = (!outOfRange && array[nx][ny] != 0); // 이미 채워진 칸
22+
23+
if (outOfRange || filled) {
24+
dir = (1 + dir) % 4; // 4방향
25+
nx = x + dx[dir];
26+
ny = y + dy[dir];
27+
}
28+
x = nx; y = ny; //위치 갱신
29+
}
30+
}
31+
32+
void print() {
33+
int width = String.valueOf( array.length * array.length ).length(); // 칸 수 = 문자 개수
34+
for (int i = 0; i < array.length; i++) {
35+
for (int j = 0; j < array[i].length; j++) {
36+
System.out.printf("%" + width + "d ", array[i][j]);
37+
}
38+
System.out.println();
39+
}
40+
41+
}
42+
43+
// 29단계 (심화): 달팽이 배열 생성 클래스
44+
// 문제: 1주차 21번 달팽이 배열 만들기를 클래스로 재설계하세요.
45+
// 1. SnailArray.java 클래스를 만듭니다.
46+
// 2. int[][] array를 멤버 변수로 가집니다.
47+
// 3. 생성자에서 배열의 크기 N을 받아 N x N 배열을 생성하고, 달팽이 모양으로 숫자를 채워 넣는
48+
// 로직을 수행합니다.
49+
// 4. 배열을 출력하는 print() 메서드를 구현합니다.
50+
// SnailTest.java에서 SnailArray 객체를 생성하고 print()를 호출하여 결과를 확인하세요.
51+
// 핵심 사고: 복잡한 알고리즘 로직 전체를 클래스의 생성자 또는 특정 메서드 안에 캡슐화하여 구현하는
52+
// 능력을 기릅니다.
53+
// 힌트: 클래스, 생성자, 멤버 변수(2차원 배열), 메서드, for문 또는 while문, if문
54+
55+
}

week02/advanced/SnailArray2.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package week02.advanced;
2+
3+
public class SnailArray2 {
4+
5+
int[][] array;
6+
7+
SnailArray2(int N){
8+
array = new int [N][N];
9+
10+
int top = 0; int bottom = N-1;
11+
int left = 0; int right = N-1;
12+
int cnt = 0;
13+
14+
while (cnt < N * N) {
15+
if (cnt < N * N && top <= bottom) { // 행 체크용
16+
for (int i = left; i <= right; i++) { // 오른쪽으로 이동
17+
array[top][i] = cnt++;
18+
}
19+
top++;
20+
}
21+
if (cnt < N * N && left <= right) { // 열 체크용
22+
for (int i = top; i <= bottom; i++) { // 아래로 이동
23+
array[i][right] = cnt++;
24+
}
25+
right--;
26+
}
27+
if (cnt < N * N && top <= bottom) { // 행 체크용
28+
for (int i = right; i >= left; i--) { // 왼쪽으로 이동
29+
array[bottom][i] = cnt++;
30+
}
31+
bottom--;
32+
}
33+
if (cnt < N * N && left <= right) { // 열 체크용
34+
for (int i = bottom; i >= top; i--) { // 위로 이동
35+
array[i][left] = cnt++;
36+
}
37+
left++;
38+
}
39+
}
40+
}
41+
42+
void print() {
43+
int width = String.valueOf(array.length * array.length).length();
44+
for (int i = 0; i < array.length; i++) {
45+
for (int j = 0; j < array[i].length; j++) {
46+
System.out.printf("%" + width + "d " , array[i][j]);
47+
}
48+
System.out.println();
49+
}
50+
}
51+
52+
}
53+
54+
//29단계 (심화): 달팽이 배열 생성 클래스
55+
//문제: 1주차 21번 달팽이 배열 만들기를 클래스로 재설계하세요.
56+
// 1. SnailArray.java 클래스를 만듭니다.
57+
// 2. int[][] array를 멤버 변수로 가집니다.
58+
// 3. 생성자에서 배열의 크기 N을 받아 N x N 배열을 생성하고, 달팽이 모양으로 숫자를 채워 넣는
59+
// 로직을 수행합니다.
60+
// 4. 배열을 출력하는 print() 메서드를 구현합니다.
61+
// SnailTest.java에서 SnailArray 객체를 생성하고 print()를 호출하여 결과를 확인하세요.
62+
//핵심 사고: 복잡한 알고리즘 로직 전체를 클래스의 생성자 또는 특정 메서드 안에 캡슐화하여 구현하는
63+
//능력을 기릅니다.
64+
//힌트: 클래스, 생성자, 멤버 변수(2차원 배열), 메서드, for문 또는 while문, if문

week02/advanced/SnailTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package week02.advanced;
2+
3+
public class SnailTest {
4+
5+
public static void main(String[] args) {
6+
System.out.println("<달팽이 배열 생성 클래스>");
7+
// 29단계 (심화): 달팽이 배열 생성 클래스
8+
// 문제: 1주차 21번 달팽이 배열 만들기를 클래스로 재설계하세요.
9+
// 1. SnailArray.java 클래스를 만듭니다.
10+
// 2. int[][] array를 멤버 변수로 가집니다.
11+
// 3. 생성자에서 배열의 크기 N을 받아 N x N 배열을 생성하고, 달팽이 모양으로 숫자를 채워 넣는
12+
// 로직을 수행합니다.
13+
// 4. 배열을 출력하는 print() 메서드를 구현합니다.
14+
// SnailTest.java에서 SnailArray 객체를 생성하고 print()를 호출하여 결과를 확인하세요.
15+
// 핵심 사고: 복잡한 알고리즘 로직 전체를 클래스의 생성자 또는 특정 메서드 안에 캡슐화하여 구현하는
16+
// 능력을 기릅니다.
17+
// 힌트: 클래스, 생성자, 멤버 변수(2차원 배열), 메서드, for문 또는 while문, if문
18+
System.out.println("--5 X 5 달팽이 배열--");
19+
SnailArray s = new SnailArray(5); // SnailArray 방법
20+
s.print();
21+
22+
System.out.println();
23+
System.out.println("------------10 X 10 달팽이 배열------------");
24+
SnailArray2 s2 = new SnailArray2(10); // SnailArray2 방법
25+
s2.print();
26+
27+
}
28+
29+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package week02.advanced;
2+
3+
public class VendingMachine {
4+
private Drink [] drinks;
5+
private int money;
6+
7+
void setupDrinks(){
8+
drinks = new Drink[5];
9+
drinks[0] = new Drink("콜라", 1500, 8);
10+
drinks[1] = new Drink("사이다", 1500, 7);
11+
drinks[2] = new Drink("환타", 1500, 6);
12+
drinks[3] = new Drink("알로에", 3000, 5);
13+
drinks[4] = new Drink("커피", 800, 2);
14+
}
15+
16+
void print() {
17+
for (int i = 0; i < drinks.length; i++) {
18+
Drink d = drinks[i];
19+
System.out.println((i+1) + ". " + d.getName() + " 가격: " + d.getPrice() + ", 재고: " + d.getStock());
20+
}
21+
}
22+
23+
void insertMoney(int m){
24+
money += m;
25+
System.out.println("현재 투입 금액: " + money);
26+
}
27+
28+
int selectDrink(int index){
29+
if (index < 0 || index > drinks.length) {
30+
return -3;
31+
}
32+
Drink d = drinks[index];
33+
34+
if (d.getStock() <= 0) {
35+
return -1;
36+
}
37+
if (money < d.getPrice()) {
38+
System.out.println("현재 투입 금액이" + (d.getPrice() - money) + "원만큼 부족합니다.");
39+
return -2;
40+
}
41+
d.setStock(d.getStock()-1);
42+
int change = money - d.getPrice();
43+
money = 0;
44+
return change;
45+
}
46+
47+
}
48+
49+
// 30단계 (심화): 자판기 시스템의 완성
50+
// 문제:
51+
// 1. Drink.java: 이름(name), 가격(price), 재고(stock)를 private 멤버와
52+
// Getter/Setter로 가집니다.
53+
// 2. VendingMachine.java: Drink 객체 배열(drinks)과 투입된 금액(money)을
54+
// 멤버로 가집니다. 음료를 세팅하는 setupDrinks() 메서드, 돈을 투입하는 insertMoney(int m),
55+
// 음료를 선택하는 selectDrink(int index) 메서드를 구현하세요. selectDrink는 성공 시
56+
// 거스름돈, 재고 부족 시 -1, 금액 부족 시 -2를 리턴합니다.
57+
// 3. VendingMachineTest.java에서 자판기를 만들고, while 루프를 통해 사용자 상호작용
58+
// (돈 투입, 음료 선택)을 시뮬레이션하세요. selectDrink의 리턴값에 따라 다른 메시지를
59+
// 출력해야 합니다.
60+
// 핵심 사고: 여러 클래스와 복잡한 상태(재고, 돈)를 종합적으로 관리하며, 메서드의 다양한 리턴값을 통해
61+
// 프로그램의 흐름을 제어하는 완성도 높은 프로그램을 설계합니다.
62+
// 힌트: 종합적인 클래스 설계, 상태 관리, 메서드 리턴값을 이용한 로직 분기, while문,
63+
// if-else if-else, input

0 commit comments

Comments
 (0)