예제 몇문제 풀고 넘어가자 ~
야구게임
1~9사이의 수 3개를 컴퓨터가 선택하고
사용자가 그 수를 위치까지 정확하게 맞추는 게임
예를들어 4,7,8을 컴퓨터가 선택했다고 가정하면
수를입력 : 123
out
수를입력: 456
1s 0b
수: 567
0s 1b
수를입력: 789
0s 2b
수를입력: 487
1s 2b
수를입력: 478
6번만에 맞추셨습니다.
문자배열로 받아야함 / 문자열로 x
** 컴퓨터 수 생성! 늘 하던대로 매스랜덤 이용
** 중복확인시 , j의 범위를 잘 두는 것이 중요. j는 현재 나온 i까지의 값만 보면 돼서, 범위가 i 까지이다!!
** 다음, 내 수를 입력할 때 배열로 받아두는데, 차형으로 안받은 이유는 컴이 인트 값이라 비교하기 위해 맞춤!!
** 차형으로 받으면 아스키코드로 받으니까, 수치로 받고 0의 아스키코드값이 48이니 -48을 해준다.
** 차례로 숫자를 입력하고 마지막 값인 엔터값도 들어가니까 system.in.skip(5); 로 엔터값 빼주기
상수및 메소드부 / 힙 /스택/ 레지스트리 가 있는데
레지스트리는 os관리 os콘솔담당 (우리가 다루는 부분이아님)
상수및 메소드 나중에
java는 jvm이 메모리를 관리해준다.
힙 = 동적 메모리 영역 / new : -동적메모리 할당 연산자 / 힙에 데이터를 만들려고 하는거
java의 경우, 힙(=동적메모리)에 데이터를 넣을 때, new 연산자를 사용
자바에서는 뉴라는 말이 없으면 힙에 저장되지않음 그럼 다 어디가? 스택
new가 없으면 힙에 데이터 못씀!!! 이건 꼭 기억하자!
int [][] arr = new int[숫자][혹은 동적]; // 이런식으로 표현
예제로 풀어보자 ~
1)
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
를 표현해봐 !!
** 이차원 배열을 만들어 / 행열이 각각 5줄이니 [5][5]로!
** 숫자를 보면 하나씩 증가하고 있으니, 변수 co 를 만들고 시작점을 1로하자!
** 표현은? -> 5개씩 끊어서 하고 있어, 5개가 끝나면 println을 해주자 ~!
2)
21 16 11 6 1
22 17 12 7 2
23 18 13 8 3
24 19 14 9 4
25 20 15 10 5
해보자 !
12345 오른쪽 끝에서부터 희한한 방식 이네 ~ (for문 별찍기 같은 응용!)
** 숫자 생성 -> 위에거랑 똑같이 1-25 까지니 방식 같음.
** 배치를 어떻게 할것인가? - 위에 기본형에서 좌표가 바뀌었으니, 좌표의 규칙을 찾아내자.
** 그리고 arr[j][i] 같이 정확하게 써주면 됨!
3)
25 24 23 22 21
20 19 18 17 16
15 14 13 12 11
10 9 8 7 6
5 4 3 2 1
** 순서만 바뀌고 똑같음~
4)
5 10 15 20 25
4 9 14 19 24
3 8 13 18 23
2 7 12 17 22
1 6 11 16 21
** 얘도 규칙만 찾아내면 ez~
참고) 시간날때 해보자 ~ 위 문제의 응용버전들
예제10번 골뱅이로 돌아가는 숫자
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
public class Exam_10 {
public static void main(String[] args) {
int[][] arr = new int[5][5];
int co = 1;
for(int i=0; i<=4; ++i) arr[0][i] = co++;
for(int i=1; i<=4; ++i) arr[i][4] = co++;
for(int i=3; i>=0; --i) arr[4][i] = co++;
for(int i=3; i>=1; --i) arr[i][0] = co++;
for(int i=1; i<=3; ++i) arr[1][i] = co++;
for(int i=2; i<=3; ++i) arr[i][3] = co++;
for(int i=2; i>=1; --i) arr[3][i] = co++;
for(int i=2; i>=2; --i) arr[i][1] = co++;
for(int i=2; i<=2; ++i) arr[2][i] = co++;
for(int i=0; i<5; ++i) {
for(int j=0; j<5; ++j) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
//얘를 한번 더 줄인게 11번에 !
public class Exam_11 {
public static void main(String[] args) {
int[][] arr = new int[5][5];
int co = 1;
int t = 4;
for(int k=0; k<=t; ++k) {
for(int i=k; i<=t; ++i) arr[k][i] = co++;
for(int i=k+1; i<=t; ++i) arr[i][t] = co++;
for(int i=t-1; i>=k; --i) arr[t][i] = co++;
for(int i=t-1; i>=k+1; --i) arr[i][k] = co++;
t--;
}
/*
for(int i=0; i<=4; ++i) arr[0][i] = co++;
for(int i=1; i<=4; ++i) arr[i][4] = co++;
for(int i=3; i>=0; --i) arr[4][i] = co++;
for(int i=3; i>=1; --i) arr[i][0] = co++;
for(int i=1; i<=3; ++i) arr[1][i] = co++;
for(int i=2; i<=3; ++i) arr[i][3] = co++;
for(int i=2; i>=1; --i) arr[3][i] = co++;
for(int i=2; i>=2; --i) arr[i][1] = co++;
for(int i=2; i<=2; ++i) arr[2][i] = co++;
*/
for(int i=0; i<5; ++i) {
for(int j=0; j<5; ++j) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
// 10번과같은데 줄임
=================================
예제 12번
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
5의 마방진
홀수마방진
시작은 첫째줄 가운데서 시작
숫자의 움직임은 오른쪽 대각선 위로 이동
이동한 곳의 행이 음수가 되면 그 열의 최대값(4)으로 이동,
이동한 곳의 열이 배열의 최대값을 넘어가면 그 행의 0번째로 이동,
만약 이동한곳에 숫자가 존재하면 움직이기 전 위치로 이동한 후, 한줄내려 다시 시작
public class Exam_12 {
public static void main(String[] args) {
int[][] arr = new int[5][5];
int i = 0; //첫번째줄... i는 줄의 위치를 나타낼 변수
int j = 2; //가운데열... j는 열의 위치를 나타낼 변수
int co = 1; //배열위치에 값을 넣기 위한 변수
while(co<=25) {
arr[i][j] = co;
int oldI = i, oldJ = j;//옮기기 전에 값을 미리 저장을 한다
i--; j++; //2번조건에 의한 식
if (i<0) i=4; //3번조건
if (j>4) j=0; //4번조건
if (arr[i][j] != 0) { //5번조건
i = oldI; i++;
j = oldJ;
}
co++;
}
for(i=0; i<5; ++i) {
for(j=0; j<5; ++j) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
—다른방식 -
public class Exam_07 {
public static void main(String[] args) {
int[][] arr = new int[5][5];
int i = 0; //첫번째줄... i는 줄의 위치를 나타낼 변수
int j = 2; //가운데열... j는 열의 위치를 나타낼 변수
//int co = 1; //배열위치에 값을 넣기 위한 변수
//while(co<=25) {
for(int co=1; co<=25; ++co) {
arr[i][j] = co;
int oldI = i, oldJ = j;//옮기기 전에 값을 미리 저장을 한다
i--; j++; //2번조건에 의한 식
if (i<0) i=4; //3번조건
if (j>4) j=0; //4번조건
if (arr[i][j] != 0) { //5번조건
i = oldI; i++;
j = oldJ;
}
//co++;
}
for(i=0; i<5; ++i) {
for(j=0; j<5; ++j) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
—----홀수 마방진 000====
import java.util.*;
public class Exam_121212 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int su;
do {
System.out.print("홀수만 입력 : ");
su = in.nextInt();
}while(su%2 == 0);
int[][] arr = new int[su][su];
int i = 0; //첫번째줄... i는 줄의 위치를 나타낼 변수
int j = su/2; //가운데열... j는 열의 위치를 나타낼 변수
//int co = 1; //배열위치에 값을 넣기 위한 변수
//while(co<=25) {
for(int co=1; co<=su*su; ++co) {
arr[i][j] = co;
int oldI = i, oldJ = j;//옮기기 전에 값을 미리 저장을 한다
i--; j++; //2번조건에 의한 식
if (i<0) i=su-1; //3번조건
if (j>su-1) j=0; //4번조건
if (arr[i][j] != 0) { //5번조건
i = oldI; i++;
j = oldJ;
}
//co++;
}
for(i=0; i<su; ++i) {
for(j=0; j<su; ++j) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
//홀수마방진
—-------------------------------------------------
예제 13
1 10 11 20 21
2 9 12 19 22
3 8 13 18 23
4 7 14 17 24
5 6 15 16 25
public class Exam_10 {
public static void main(String[] args) {
int[][] arr = new int[5][5];
int co = 1;
for (int i=0; i<=4; ++i) {
if (i%2==0) {
for(int j=0; j<=4; ++j) {
arr[j][i] = co++;
}
}else {
for(int j=4; j>=0; --j) {
arr[j][i] = co++;
}
}
}
for(int i=0; i<5; ++i) {
for(int j=0; j<5; ++j) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
—----------------------------------------------
14문제
1
2 3 4
5 6 7 8 9
10 11 12
13
—-----------------------------------------------
15문제
1
2 9 8
3 10 13 12 7
4 11 6
5