Skip to content

Commit dd39557

Browse files
authored
Add files via upload
import week01 java practice
1 parent eb4d49c commit dd39557

34 files changed

Lines changed: 1728 additions & 0 deletions
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package week01.advanced;
2+
3+
import java.util.Scanner;
4+
5+
public class BaseballGamePro {
6+
7+
public static void main(String[] args) {
8+
System.out.println("<배열을 이용한 숫자 야구 게임>");
9+
// 23단계 (심화): 배열을 이용한 숫자 야구 게임 완성하기
10+
// 문제: 컴퓨터가 중복되지 않는 3개의 1~9 사이의 숫자를 생성합니다.
11+
// 사용자가 3개의 숫자를 입력하여 맞출 때까지 게임을 진행하세요.
12+
// 결과를 'S(스트라이크)', 'B(볼)'로 알려주고, 3S가 나오면
13+
// 몇 번 만에 맞췄는지 시도 횟수를 알려주고 게임을 종료합니다.
14+
// 핵심 사고: 중복 없는 난수 생성 로직, 사용자의 입력과
15+
// 정답 배열을 비교하는 이중 for문 로직
16+
// 힌트: `배열`, `while문` (난수 생성 및 게임 전체 루프),
17+
// `for문` (값 비교), `Math class`
18+
int[]comNum = new int[3];
19+
int [] userNum = new int[3];
20+
int strike=0;
21+
int ball=0;
22+
int cnt = 0;
23+
24+
//컴퓨터가 중복되지 않는 3개의 1~9 사이의 숫자를 생성
25+
for(int i=0;i<comNum.length;i++) {
26+
comNum[i]=(int)(Math.random()*9+1);
27+
for(int j=0;j<i;j++) {
28+
if(comNum[i]==comNum[j]) {
29+
i--;
30+
break;
31+
}
32+
}
33+
}
34+
35+
Scanner scanner = new Scanner(System.in);
36+
while(strike!=3) {
37+
strike=0; ball=0;
38+
System.out.println("숫자 3자리를 입력하세요.> ");
39+
String num = scanner.nextLine();
40+
cnt++;
41+
String [] str = num.split("");
42+
for(int i=0;i<str.length;i++) {
43+
userNum[i] = Integer.parseInt(str[i]);
44+
}
45+
for(int i=0;i<comNum.length;i++) {
46+
for(int j=0;j<comNum.length;j++) {
47+
if(comNum[i]==userNum[j]&&i==j) {
48+
strike++;
49+
}
50+
else if(comNum[i]==userNum[j]&&i!=j) {
51+
ball++;
52+
}
53+
}
54+
}
55+
if(ball==0&&strike==0) {
56+
System.out.println("out!");
57+
}
58+
else {
59+
System.out.println(strike+"s"+ball+"b");
60+
}
61+
62+
}
63+
System.out.println("3s! "+cnt+"번 만에 맞추셨습니다!");
64+
scanner.close();
65+
}
66+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package week01.advanced;
2+
3+
import java.util.Scanner;
4+
5+
public class ConsoleBulletinBoard {
6+
7+
public static void main(String[] args) {
8+
System.out.println("<콘솔 기반 게시판 만들기 (기능 구현)>");
9+
// 27단계 (심화): 콘솔 기반 게시판 만들기 (기능 구현)
10+
// 문제: 문자열 배열을 사용하여 간단한 콘솔 게시판의 핵심 기능을 구현합니다.
11+
// 제목들을 저장할 `String[]` 배열을 만들고,
12+
// 다음 기능을 메뉴로 제공하는 프로그램을 작성하세요.
13+
// 1. 글쓰기: 사용자에게 제목을 입력받아 배열에 추가합니다.
14+
// 2. 목록 보기: 배열에 저장된 모든 제목을 번호와 함께 출력합니다.
15+
// 3. 종료: 프로그램을 끝냅니다.
16+
// - 핵심 사고: 배열의 인덱스를 관리하여 데이터를 추가하고 조회하는 로직
17+
// - 힌트: `String 배열`, `while문`, `switch문`,
18+
// `글 개수를 저장할 count 변수`
19+
int cnt=0;
20+
String [] title = new String[5];
21+
Scanner scanner = new Scanner(System.in);
22+
23+
while (true) {
24+
System.out.println("------------menu------------");
25+
System.out.println(" 1.글쓰기 || 2.목록 보기 || 3.종료 ");
26+
System.out.println("원하는 메뉴의 숫자를 입력해주세요.> ");
27+
28+
int menu = scanner.nextInt();
29+
scanner.nextLine();//개행 소비
30+
31+
switch(menu) {
32+
case 1:
33+
if(cnt==title.length) {
34+
String[] newTitle = new String[title.length + 5];
35+
System.arraycopy(title, 0, newTitle, 0, title.length);
36+
title = newTitle;
37+
}
38+
System.out.println("제목: ");
39+
title[cnt] = scanner.nextLine();
40+
cnt++;
41+
break;
42+
case 2: for(int i=0; i<cnt;i++) {
43+
System.out.println((i+1)+". 제목: "+title[i]);
44+
}break;
45+
case 3: System.out.println("시스템을 종료합니다.");
46+
scanner.close();
47+
return;
48+
default: System.out.println("메뉴에 없는 번호를 입력하셨습니다."); break;
49+
}
50+
}
51+
}
52+
}

week01/advanced/FindMode.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package week01.advanced;
2+
3+
public class FindMode {
4+
5+
public static void main(String[] args) {
6+
System.out.println("<배열에서 최빈값(가장 자주 나온 수)>");
7+
// 25단계 (심화): 배열에서 최빈값(가장 자주 나온 수) 찾기
8+
// 문제: 정수가 들어있는 배열에서 가장 많이 등장하는 숫자를 찾는 프로그램을 작성하세요.
9+
// 만약 최빈값이 여러 개라면 그중 아무거나 하나만 출력하면 됩니다.
10+
// 핵심 사고: 각 숫자가 몇 번 나왔는지 효율적으로 세는 방법.
11+
// (힌트: 또 다른 배열을 카운팅 용도로 사용)
12+
// 힌트: `배열`, `이중 for문`, `카운팅을 위한 변수 또는 배열`
13+
int [] num = {1,3,5,7,9,2,4,6,8,3,5,2,0,3,3,6,4,0,4,2,2,3
14+
,6,5,3,4,7,8,5,3,5,6,3,8,3,4,3,3,5,4,3,2}; //정해진 숫자
15+
int [] cnt = new int [10]; //1~9가능
16+
int maxCnt = 0;
17+
int maxNum = 0;
18+
19+
// for문 1개 이용
20+
for(int i=0; i<num.length;i++) {
21+
cnt[num[i]]++;
22+
if(cnt[num[i]]>maxCnt) {
23+
maxCnt = cnt[num[i]];
24+
maxNum = num[i];
25+
}
26+
}
27+
System.out.println("최빈값 "+maxNum+"은(는) "+maxCnt+"번 나왔습니다.");
28+
}
29+
}

week01/advanced/FindMode2.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package week01.advanced;
2+
3+
import java.util.Scanner;
4+
5+
public class FindMode2 {
6+
7+
public static void main(String[] args) {
8+
System.out.println("<배열에서 최빈값2(가장 자주 나온 수)>");
9+
// 25단계 (심화): 배열에서 최빈값(가장 자주 나온 수) 찾기
10+
// 문제: 정수가 들어있는 배열에서 가장 많이 등장하는 숫자를 찾는 프로그램을 작성하세요.
11+
// 만약 최빈값이 여러 개라면 그중 아무거나 하나만 출력하면 됩니다.
12+
// 핵심 사고: 각 숫자가 몇 번 나왔는지 효율적으로 세는 방법.
13+
// (힌트: 또 다른 배열을 카운팅 용도로 사용)
14+
// 힌트: `배열`, `이중 for문`, `카운팅을 위한 변수 또는 배열`
15+
int [] cnt = new int[10]; // 0~9까지만 비교가능
16+
int maxCnt = 0;
17+
int maxNum = 0;
18+
19+
//숫자를 원하는 개수만큼 넣을 수 있음.
20+
Scanner scanner = new Scanner(System.in);
21+
System.out.println("0~9 사이의 숫자를 원하는만큼 입력하세요.>");
22+
System.out.println("(*띄어쓰기로 숫자를 구분하여 주세요.*)");
23+
String inputNum = scanner.nextLine();
24+
String [] str = inputNum.split(" ");
25+
int [] num = new int[str.length];
26+
27+
for(int i=0; i<str.length;i++) {
28+
num[i] = Integer.parseInt(str[i]);
29+
}
30+
31+
for(int i=0; i<num.length;i++) {
32+
cnt[num[i]]++;
33+
if(cnt[num[i]]>maxCnt) {
34+
maxCnt = cnt[num[i]];
35+
maxNum = num[i];
36+
}
37+
}
38+
System.out.println("최빈값 "+maxNum+"은(는) "+maxCnt+"번 나왔습니다.");
39+
scanner.close();
40+
}
41+
}

week01/advanced/FindMode3.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package week01.advanced;
2+
3+
import java.util.Scanner;
4+
5+
public class FindMode3 {
6+
7+
public static void main(String[] args) {
8+
System.out.println("<배열에서 최빈값3(가장 자주 나온 수)>");
9+
// 25단계 (심화): 배열에서 최빈값(가장 자주 나온 수) 찾기
10+
// 문제: 정수가 들어있는 배열에서 가장 많이 등장하는 숫자를 찾는 프로그램을 작성하세요.
11+
// 만약 최빈값이 여러 개라면 그중 아무거나 하나만 출력하면 됩니다.
12+
// 핵심 사고: 각 숫자가 몇 번 나왔는지 효율적으로 세는 방법.
13+
// (힌트: 또 다른 배열을 카운팅 용도로 사용)
14+
// 힌트: `배열`, `이중 for문`, `카운팅을 위한 변수 또는 배열`
15+
int maxCnt = 0;
16+
int maxNum = 0;
17+
18+
Scanner scanner = new Scanner(System.in);
19+
System.out.println("숫자를 원하는만큼 입력하세요.>");
20+
System.out.println("(*띄어쓰기로 숫자를 구분하여 주세요.*)");
21+
String inputNum = scanner.nextLine();
22+
String [] str = inputNum.split(" ");
23+
int [] num = new int[str.length];
24+
25+
for(int i=0; i<str.length;i++) {
26+
num[i] = Integer.parseInt(str[i]);
27+
}
28+
// 이중 포문 이용 버전(자리수 상관X)
29+
for(int i=0; i<num.length;i++) {
30+
int cnt = 0;
31+
for(int j=0; j<num.length; j++) {
32+
if(num[i]==num[j]) {
33+
cnt++;
34+
}
35+
}
36+
if(cnt>maxCnt) {
37+
maxCnt=cnt;
38+
maxNum=num[i];
39+
}
40+
}
41+
System.out.println("최빈값 "+maxNum+"은(는) "+maxCnt+"번 나왔습니다.");
42+
scanner.close();
43+
}
44+
}

week01/advanced/GameOfLife.java

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package week01.advanced;
2+
3+
import java.util.Random;
4+
5+
public class GameOfLife {
6+
7+
public static void main(String[] args) {
8+
System.out.println("<라이프 게임(Game of Life) 1세대 구현>");
9+
System.out.println();
10+
// 26단계 (심화): 라이프 게임(Game of Life) 1세대 구현
11+
// 문제: 10x10 크기의 2차원 배열에 생명체(1)와 공간(0)을 임의로 배치합니다.
12+
// 다음 세대의 상태를 계산하여 새로운 2차원 배열에 저장하고 출력하세요.
13+
// - 규칙:
14+
// 1. 살아있는 칸 주변(8방향)에 살아있는 칸이 2개 미만이면, 외로워서 죽는다. (0)
15+
// 2. 살아있는 칸 주변에 살아있는 칸이 2개 또는 3개이면, 다음 세대에도 산다. (1)
16+
// 3. 살아있는 칸 주변에 살아있는 칸이 3개 초과이면, 과밀하여 죽는다. (0)
17+
// 4. 죽어있는 칸 주변에 살아있는 칸이 정확히 3개이면, 새로운 생명이 탄생한다. (1)
18+
// 핵심 사고: 2차원 배열의 특정 위치를 기준으로 주변 8칸을 탐색하고
19+
// 경계 조건을 처리하는 능력
20+
// 힌트: `다중 배열`, `이중 for문` (전체 배열 탐색),
21+
// `이중 for문` (주변 8칸 탐색)
22+
23+
// {1,0,1,0,1,0,1,0,0,1},
24+
// {0,1,0,1,0,0,1,0,0,0},
25+
// {0,1,0,0,1,1,1,1,1,0},
26+
// {1,1,1,0,0,0,0,0,1,1},
27+
// {0,1,1,0,1,1,0,0,1,0},
28+
// {0,0,0,0,1,1,1,1,1,1},
29+
// {0,1,1,0,0,1,1,0,0,1},
30+
// {1,1,1,0,0,0,1,0,1,0},
31+
// {1,1,0,0,0,1,1,0,1,0}};
32+
//
33+
// for (int i = 0; i < 10; i++) { // 배운 거 활용
34+
// for (int j = 0; j < 10; j++) {
35+
// arr[i][j] = (int)(Math.random()*2);
36+
// }
37+
// }
38+
/* nextInt() (인자 없음): int의 전체 범위에서 균등하게 하나 (음수 포함).
39+
* nextInt(n): 0 이상 n 미만의 정수 하나 (항상 음수 아님).
40+
* 0 또는 1: rand.nextInt(2)
41+
* 1~6(주사위): rand.nextInt(6) + 1
42+
* a~b (포함, a ≤ b): rand.nextInt(b - a + 1) + a */
43+
Random rand = new Random(); // 새로 배운 랜덤수 생성
44+
int[][] arr = new int[10][10];
45+
for (int i = 0; i < 10; i++) {
46+
for (int j = 0; j < 10; j++) {
47+
arr[i][j] = rand.nextInt(2); // 0 또는 1
48+
}
49+
}
50+
System.out.println("-------초기 배열-------");
51+
for(int i=0; i<arr.length;i++) {
52+
for(int j=0; j<arr[i].length;j++) {
53+
System.out.print(arr[i][j]+" ");
54+
}
55+
System.out.println();
56+
}
57+
/* 북(-1)
58+
* 서(-1) 동(+1)
59+
* 남(+1)
60+
* 8방향 {서,북서,북,북동,동,동남,남,남서}
61+
* 서,동: 행 변화X, 열 변화O
62+
* 북,남: 행 변화O, 열 변화X
63+
* 북서,북동,동남,남서: 행 변화O, 열 변화O
64+
*/
65+
int[]dr={0, -1, -1, -1, 0, 1, 1, 1}; // 행 변화
66+
int[]dc={-1, -1, 0, 1, 1, 1, 0, -1}; // 열 변화
67+
68+
int[][] next = new int[arr.length][arr[0].length];
69+
for(int i=0; i<arr.length;i++) {
70+
for(int j=0; j<arr[i].length;j++) {
71+
int cnt = 0; // 매번 살아있는 칸 초기화
72+
for(int k=0;k<dr.length;k++) { // i,j->행,열 탐색 k->주변 8방향 확인
73+
int nx = i+dr[k]; // 행 탐색
74+
int ny = j+dc[k]; // 열 탐색
75+
boolean outOfRange = (nx<0||nx>=arr.length||ny<0||ny>=arr[0].length);
76+
if(!outOfRange&&arr[nx][ny]==1) { // 살아있는 칸 개수 확인
77+
cnt++;
78+
}
79+
}
80+
if(arr[i][j]==1) { // 살아있는 칸 주변에
81+
if(cnt<2) {
82+
next[i][j]=0;//죽음
83+
}
84+
else if(cnt==2||cnt==3) {
85+
next[i][j]=1;//생존
86+
}
87+
else if(cnt>3) {
88+
next[i][j]=0;//죽음
89+
}
90+
91+
}
92+
else if(arr[i][j]==0&&cnt==3) { // 죽어있는 칸 주변에
93+
next[i][j]=1;//탄생
94+
}
95+
}
96+
}
97+
System.out.println();
98+
System.out.println("----게임 진행 후 배열----");
99+
for(int i=0; i<next.length;i++) {
100+
for(int j=0; j<next[i].length;j++) {
101+
System.out.print(next[i][j]+" ");
102+
}
103+
System.out.println();
104+
}
105+
}
106+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package week01.advanced;
2+
3+
public class MatrixMultiplication {
4+
5+
public static void main(String[] args) {
6+
System.out.println("<행렬(2차원 배열) 곱셈>");
7+
// 24단계 (심화): 행렬(2차원 배열) 곱셈
8+
// 문제: 3x2 행렬과 2x3 행렬을 각각 2차원 배열로 초기화합니다.
9+
// 두 행렬의 곱셈 결과를 계산하여 3x3 크기의 새로운 2차원 배열에 저장하고 출력하세요.
10+
// 핵심 사고: 행렬 곱셈의 수학적 원리를 3중 for문으로 구현하는 능력
11+
// 행렬 곱셈식: C[i][j] = Σ₍k=0..M−1₎ A[i][k] · B[k][j]
12+
// 힌트: `다중 배열`, 3중 for문
13+
/* A B
14+
* (0,0) (0,1)
15+
* ----------- (0,0) | (0,1) | (0,2)
16+
* (1,0) (1,1) X (1,0) | (1,1) | (1,2)
17+
* -----------
18+
* (2,0) (2,1)
19+
*
20+
* A(0,0)*B(0,0)+A(0,1)*B(1,0) A(0,0)*B(0,1)+A(0,1)*B(1,1) A(0,0)*B(0,2)+A(0,1)*B(1,2)
21+
* A(1,0)*B(0,0)+A(1,1)*B(1,0) A(1,0)*B(0,1)+A(1,1)*B(1,1) A(1,0)*B(0,2)+A(1,1)*B(1,2)
22+
* A(2,0)*B(0,0)+A(2,1)*B(1,0) A(2,0)*B(0,1)+A(2,1)*B(1,1) A(2,0)*B(0,2)+A(2,1)*B(1,2)
23+
* */
24+
int [][]arr1 = {{67,54},{10,81},{34,62}};
25+
int [][]arr2 = {{34,6,82},{64,91,23}};
26+
int [][]result = new int [3][3];
27+
28+
// A[i][k]*B[k][j] = C[i][j]
29+
for(int i=0; i<arr1.length;i++) { //범위: A의 행 수
30+
for(int j=0;j<arr2[0].length;j++) { //범위: B의 열수
31+
result[i][j]=0;
32+
//int sum = 0; //누적 2번째 방법
33+
for(int k=0;k<arr1[0].length;k++) { //범위:A의 열의 수 or B의 행의 수
34+
result[i][j] += arr1[i][k]*arr2[k][j];
35+
//sum += arr1[i][k]*arr2[k][j];
36+
}
37+
//result[i][j] = sum;
38+
}
39+
}
40+
for(int i=0;i<result.length;i++) {
41+
for(int j=0; j<result[i].length; j++) {
42+
System.out.print(result[i][j]+" ");
43+
}
44+
System.out.println();
45+
}
46+
}
47+
}

0 commit comments

Comments
 (0)