Skip to content

Commit ce1a398

Browse files
authored
Add files via upload
1 parent 8a42961 commit ce1a398

9 files changed

Lines changed: 447 additions & 0 deletions

File tree

week02/advanced/BaseballGame.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package week02.advanced;
2+
3+
import java.util.Scanner;
4+
5+
public class BaseballGame {
6+
7+
public static void main(String[] args) {
8+
System.out.println("<숫자 야구 게임의 완전한 책임 분리>");
9+
// 23단계 (심화): 숫자 야구 게임의 완전한 책임 분리
10+
// 문제: 1주차 14번 숫자 야구 게임을 세 개의 클래스로 분리하여 재설계하세요.
11+
// 1. Computer.java: 정답 숫자를 생성하고(createAnswer()) 보관하는 역할(int[] answer).
12+
// 2. Referee.java: Computer의 정답과 User의 추측을 비교하여 스트라이크/볼을 판정하는
13+
// judge(int[] answer, int[] guess) static 메서드를 가진 역할.
14+
// 3. BaseballGame.java: main 메서드를 포함하며, Computer 객체를 만들고
15+
// while 루프를 돌며 사용자 입력을 받아 Referee를 통해 결과를 얻고 출력하는 게임 진행의 역할.
16+
// 핵심 사고: 프로그램의 책임과 역할을 기준으로 클래스를 명확하게 분리하여(관심사의 분리),
17+
// 코드의 재사용성과 유지보수성을 높이는 설계를 학습합니다.
18+
// 힌트: 클래스 분리, 객체 간의 협력, static 메서드, while문, input, 배열
19+
Computer c = new Computer();
20+
c.createAnswer();
21+
22+
Scanner sc = new Scanner(System.in);
23+
while (true) {
24+
System.out.print("숫자를 입력하세요. > ");
25+
String strGuess = sc.nextLine();
26+
String [] arrGuess = strGuess.split("");
27+
int [] guess = new int [c.getAnswer().length];
28+
29+
for (int i = 0; i < guess.length; i++) {
30+
guess [i] = Integer.parseInt(arrGuess[i]);
31+
}
32+
33+
// strike 개수, ball 개수
34+
int[] res = Referee.judge(c.getAnswer(), guess);
35+
int strike = res[0], ball = res[1];
36+
37+
if (strike == 0 && ball == 0) {
38+
System.out.println("out!");
39+
} else {
40+
System.out.println(strike + "s, " + ball + "b");
41+
}
42+
43+
if (strike == 3) {
44+
System.out.println("정답! 게임 종료");
45+
break;
46+
}
47+
}
48+
sc.close();
49+
}
50+
}

week02/advanced/Computer.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package week02.advanced;
2+
3+
public class Computer {
4+
5+
private int[] answer = new int [3];
6+
7+
public Computer(){
8+
9+
}
10+
11+
public int[] createAnswer() {
12+
13+
for (int i = 0; i < answer.length; i++) {
14+
while (true) {
15+
int num = (int)(Math.random()*9+1); // 1~9
16+
boolean dup = false;
17+
for (int j = 0; j < i; j++) {
18+
if (answer[j] == num) {
19+
dup = true; // while문 빠져나가기
20+
break; // 바깥 for문으로
21+
}
22+
}
23+
if (!dup) {
24+
answer[i] = num; // 중복이 아니면 배열에 넣기
25+
break;
26+
}
27+
}
28+
}
29+
return answer;
30+
}
31+
32+
public int[] getAnswer() {
33+
return answer;
34+
}
35+
36+
// 23단계 (심화): 숫자 야구 게임의 완전한 책임 분리
37+
// 문제: 1주차 14번 숫자 야구 게임을 세 개의 클래스로 분리하여 재설계하세요.
38+
// 1. Computer.java: 정답 숫자를 생성하고(createAnswer()) 보관하는 역할(int[] answer).
39+
// 2. Referee.java: Computer의 정답과 User의 추측을 비교하여 스트라이크/볼을 판정하는
40+
// judge(int[] answer, int[] guess) static 메서드를 가진 역할.
41+
// 3. BaseballGame.java: main 메서드를 포함하며, Computer 객체를 만들고
42+
// while 루프를 돌며 사용자 입력을 받아 Referee를 통해 결과를 얻고 출력하는 게임 진행의 역할.
43+
// 핵심 사고: 프로그램의 책임과 역할을 기준으로 클래스를 명확하게 분리하여(관심사의 분리),
44+
// 코드의 재사용성과 유지보수성을 높이는 설계를 학습합니다.
45+
// 힌트: 클래스 분리, 객체 간의 협력, static 메서드, while문, input, 배열
46+
}

week02/advanced/Game.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package week02.advanced;
2+
3+
public class Game {
4+
5+
public static void main(String[] args) {
6+
System.out.println("<클래스 기반의 지뢰 찾기 판 생성>");
7+
// 22단계 (심화): 클래스 기반의 지뢰 찾기 판 생성
8+
// 문제: 1주차 28번 지뢰 찾기 판 만들기를 클래스로 재설계하세요.
9+
// 1. Minesweeper.java 클래스를 만듭니다.
10+
// 2. char[][] board 보드판을 멤버 변수로 가집니다. 생성자에서 보드의 크기(e.g., 10x10)를
11+
// 받아 초기화합니다.
12+
// 3. 지뢰를 랜덤하게 심는 plantMines(int mineCount) 메서드를 만듭니다.
13+
// 4. 지뢰 주변의 숫자를 계산하는 calculateNumbers() 메서드를 만듭니다.
14+
// 5. 보드판을 출력하는 printBoard() 메서드를 만듭니다.
15+
// Game.java에서 Minesweeper 객체를 생성하고 메서드들을 순서대로 호출하여 완성된 지뢰 찾기
16+
// 판을 출력하세요.
17+
// 핵심 사고: 복잡한 절차를 가진 프로그램을 데이터(보드판)와 기능(지뢰심기, 숫자계산)으로 나누어
18+
// 클래스로 묶는 객체 지향적 설계를 연습합니다.
19+
// 힌트: 클래스, 멤버 변수(2차원 배열), 생성자, 메서드, Math class, 이중 for문, if문
20+
Minesweeper m = new Minesweeper(5);
21+
22+
m.plantMines(5);
23+
m.printBoard();
24+
m.calculateNumbers();
25+
System.out.println();
26+
m.printBoard();
27+
System.out.println();
28+
29+
Minesweeper m2 = new Minesweeper(10);
30+
31+
m2.plantMines(50);
32+
m2.printBoard();
33+
m2.calculateNumbers();
34+
System.out.println();
35+
m2.printBoard();
36+
}
37+
38+
}

week02/advanced/Minesweeper.java

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package week02.advanced;
2+
3+
public class Minesweeper {
4+
private int N;
5+
private char [][] board;
6+
7+
Minesweeper(int N) {
8+
this.N = N;
9+
this.board = new char [N][N];
10+
for (int i = 0; i < N; i++) {
11+
for(int j = 0; j < N; j++) {
12+
board[i][j] = '0';
13+
}
14+
}
15+
}
16+
17+
void plantMines(int mineCount){
18+
19+
if(mineCount > N*N || mineCount < 0) {
20+
System.out.println("지뢰 개수는 0부터 N*N이어야 합니다.");
21+
return; // 무한 루프 방지 즉시 종료
22+
}
23+
24+
int placed = 0;
25+
26+
while( placed < mineCount ) {
27+
int r = (int)(Math.random()*N);
28+
int c = (int)(Math.random()*N);
29+
if(board[r][c] == '0') {
30+
board[r][c] = 'B';
31+
placed++;
32+
}
33+
}
34+
35+
}
36+
37+
void calculateNumbers(){
38+
// 서, 북서, 북, 북동, 동, 남동, 남, 남서
39+
int [] r = {0, -1, -1, -1, 0, 1, 1, 1}; // 행
40+
int [] c = {-1, -1, 0, 1, 1, 1, 0, -1}; // 열
41+
for (int i = 0; i < N; i++) {
42+
for (int j = 0; j < N; j++) {
43+
if(board[i][j] == 'B') {
44+
continue;
45+
}
46+
int cnt = 0;
47+
for(int k = 0; k < r.length; k++) {
48+
int dx = i + r[k];
49+
int dy = j + c[k];
50+
if (dx >= 0 && dx < N && dy >= 0 && dy < N) {
51+
if (board[dx][dy] == 'B') {
52+
cnt++;
53+
}
54+
}
55+
}
56+
board[i][j] = (char)('0' + cnt);
57+
}
58+
}
59+
60+
}
61+
62+
void printBoard(){
63+
for ( char [] r : board ) {
64+
for ( char c : r ) {
65+
System.out.print(c + " ");
66+
}
67+
System.out.println();
68+
}
69+
}
70+
71+
// 22단계 (심화): 클래스 기반의 지뢰 찾기 판 생성
72+
// 문제: 1주차 28번 지뢰 찾기 판 만들기를 클래스로 재설계하세요.
73+
// 1. Minesweeper.java 클래스를 만듭니다.
74+
// 2. char[][] board 보드판을 멤버 변수로 가집니다. 생성자에서 보드의 크기(e.g., 10x10)를
75+
// 받아 초기화합니다.
76+
// 3. 지뢰를 랜덤하게 심는 plantMines(int mineCount) 메서드를 만듭니다.
77+
// 4. 지뢰 주변의 숫자를 계산하는 calculateNumbers() 메서드를 만듭니다.
78+
// 5. 보드판을 출력하는 printBoard() 메서드를 만듭니다.
79+
// Game.java에서 Minesweeper 객체를 생성하고 메서드들을 순서대로 호출하여 완성된 지뢰 찾기
80+
// 판을 출력하세요.
81+
// 핵심 사고: 복잡한 절차를 가진 프로그램을 데이터(보드판)와 기능(지뢰심기, 숫자계산)으로 나누어
82+
// 클래스로 묶는 객체 지향적 설계를 연습합니다.
83+
// 힌트: 클래스, 멤버 변수(2차원 배열), 생성자, 메서드, Math class, 이중 for문, if문
84+
85+
}

week02/advanced/Referee.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package week02.advanced;
2+
3+
public class Referee {
4+
5+
6+
public static int[] judge(int[] answer, int[] guess) {
7+
int strike = 0, ball = 0;
8+
for (int i = 0; i < answer.length; i++) {
9+
for (int j = 0; j < guess.length; j++) {
10+
if (answer[i] == guess[j] && i == j) {
11+
strike++;
12+
}
13+
else if (answer[i] == guess[j] && i!=j) {
14+
ball++;
15+
}
16+
}
17+
}
18+
return new int[] { strike, ball };
19+
}
20+
21+
22+
// 23단계 (심화): 숫자 야구 게임의 완전한 책임 분리
23+
// 문제: 1주차 14번 숫자 야구 게임을 세 개의 클래스로 분리하여 재설계하세요.
24+
// 1. Computer.java: 정답 숫자를 생성하고(createAnswer()) 보관하는 역할(int[] answer).
25+
// 2. Referee.java: Computer의 정답과 User의 추측을 비교하여 스트라이크/볼을 판정하는
26+
// judge(int[] answer, int[] guess) static 메서드를 가진 역할.
27+
// 3. BaseballGame.java: main 메서드를 포함하며, Computer 객체를 만들고
28+
// while 루프를 돌며 사용자 입력을 받아 Referee를 통해 결과를 얻고 출력하는 게임 진행의 역할.
29+
// 핵심 사고: 프로그램의 책임과 역할을 기준으로 클래스를 명확하게 분리하여(관심사의 분리),
30+
// 코드의 재사용성과 유지보수성을 높이는 설계를 학습합니다.
31+
// 힌트: 클래스 분리, 객체 간의 협력, static 메서드, while문, input, 배열
32+
33+
}

week02/advanced/Score.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package week02.advanced;
2+
3+
public class Score {
4+
private String name;
5+
private int korean;
6+
private int english;
7+
private int math;
8+
9+
Score(String name, int korean, int english, int math) {
10+
this.name = name;
11+
this.korean = korean;
12+
this.english = english;
13+
this.math = math;
14+
}
15+
16+
int getTotal() {
17+
int total = korean + english + math;
18+
return total;
19+
}
20+
21+
double getAverage() {
22+
double avg = (double) getTotal() / 3;
23+
return avg;
24+
}
25+
26+
public String getName() {
27+
return name;
28+
}
29+
30+
public int getKorean() {
31+
return korean;
32+
}
33+
34+
public int getEnglish() {
35+
return english;
36+
}
37+
38+
public int getMath() {
39+
return math;
40+
}
41+
42+
// 21단계 (심화): 클래스로 재설계하는 성적 통계 프로그램
43+
// 문제: 이름, 국어, 영어, 수학 점수를 private 멤버로 갖는 Score.java를 만드세요. 총점을 리턴하는
44+
// getTotal()과 평균을 리턴하는 getAverage() 메서드를 구현하세요. ScoreTest.java에서
45+
// Score 객체 배열을 만들고 3명의 학생 정보를 저장한 후, 반 전체의 국어 평균, 영어 평균, 수학 평균을
46+
// 계산하여 출력하세요.
47+
// 핵심 사고: 여러 객체의 데이터를 종합하여 통계를 내는 로직을 구현하며, 데이터와 기능을 클래스로
48+
// 캡슐화하는 설계를 연습합니다.
49+
// 힌트: 클래스, private, getter, 메서드, 객체 배열, 이중 for문, 자료형 변환
50+
51+
}

week02/advanced/Score2.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package week02.advanced;
2+
3+
public class Score2 {
4+
5+
private String name;
6+
private int korean;
7+
private int english;
8+
private int math;
9+
10+
public static final int SUBJECTS = 3; // 고정상수
11+
12+
Score2(String name, int korean, int english, int math) {
13+
this.name = name;
14+
this.korean = korean;
15+
this.english = english;
16+
this.math = math;
17+
}
18+
19+
int getTotal() {
20+
return korean + english + math;
21+
}
22+
23+
double getAverage() {
24+
return (double) getTotal() / SUBJECTS;
25+
}
26+
27+
// 인덱스로 점수 받기: 0=국,1=영,2=수
28+
public int getScore(int idx) {
29+
switch (idx) {
30+
case 0: return korean;
31+
case 1: return english;
32+
case 2: return math;
33+
default: throw new IllegalArgumentException("subject idx: " + idx);
34+
}
35+
}
36+
37+
public String getName() {
38+
return name;
39+
}
40+
41+
public int getKorean() {
42+
return korean;
43+
}
44+
45+
public int getEnglish() {
46+
return english;
47+
}
48+
49+
public int getMath() {
50+
return math;
51+
}
52+
53+
// 21단계 (심화): 클래스로 재설계하는 성적 통계 프로그램
54+
// 문제: 이름, 국어, 영어, 수학 점수를 private 멤버로 갖는 Score.java를 만드세요. 총점을 리턴하는
55+
// getTotal()과 평균을 리턴하는 getAverage() 메서드를 구현하세요. ScoreTest.java에서
56+
// Score 객체 배열을 만들고 3명의 학생 정보를 저장한 후, 반 전체의 국어 평균, 영어 평균, 수학 평균을
57+
// 계산하여 출력하세요.
58+
// 핵심 사고: 여러 객체의 데이터를 종합하여 통계를 내는 로직을 구현하며, 데이터와 기능을 클래스로
59+
// 캡슐화하는 설계를 연습합니다.
60+
// 힌트: 클래스, private, getter, 메서드, 객체 배열, 이중 for문, 자료형 변환
61+
62+
}

0 commit comments

Comments
 (0)