728x90
1. 2차원 배열 사용하기
- 2차원 배열은 테이블 형태의 데이터를 저장하기 위한 배열(아래 그림 참고)
- 2차원 배열은 1차원 배열이 여러 개 모여있는 형태라고 생각하면 됨. 3차원 배열은 이러한 2차원 배열이 여러개 모여있는 형태(3차원 이상 잘 안 쓰임)
- 수학에서 사용했던 '함수'를 생각하면 오히려 이해하기 편하다.
- 참고로 num[i][j] 일때 num[row][column] => i 는 행, y 좌표 , column 은 열, x 좌표
- 아래 테이블 같은 형태는
비교 | 국어 | 영어 | 수학 |
1 | 100 | 100 | 100 |
2 | 20 | 20 | 20 |
3 | 30 | 30 | 30 |
- 요런 식의 배열로 변함
- 행 index : 0 ~ 3 (함수 y 좌표)
- 열 index : 0 ~ 3 (함수 x 좌표)
score[0][0] | score[0][1] | score[0][2] | score[0][3] |
score[1][0] | score[1][1] | score[1][2] | score[1][3] |
socre[2][0] | score[2][1] | score[2][2] | score[2][3] |
score[3][0] | score[3][1] | score[3][2] | score[3][3] |
- score[0][0] , score 1행 1열에 값을 입력 & 출력방법은 다음과 같다.
score[0][0] = 100; // score 1행 1열에 100 저장
System.out.println(score[0][0]); // 1행 1열 값 출력
2. 2차원 배열의 초기화 && 선언
- { } 를 총 2번을 사용하는데 이때 안쪽에 있는 괄호는 2차원 테이블로 생각했을 때 한 행(한 줄)에 들어가는 값들이라고 생각하면 됨
int[][] arr = { {1,2,3}, {4,5,6} }; // 혹은
int[][] arr = { // 요렇게 보기좋게 하는 방법도 있음
{1,2,3}, // arr[0][0], arr[0][1], arr[0][2]
{4,5,6} // arr[1][0], arr[1][1], arr[1][2]
};
3. 2차원 배열을 활용하기 위한 2중 for 문
- 2차원 배열에서 값을 뽑아올때 사용되는 이중 for 문은 조금 특별한? 구성을 갖는다.
- 밖깥쪽 for 문은 배열을 길이, 배열 행의 수 만큼 반복해야하며, 안쪽 for 문은 배열의 i 번째 행에 있는 열의 수만큼 반복하는 for 문을 만들어야한다.
- 특히나 안쪽 for 문에서 i 번째 행의 데이터 값 수만큼 반복하는 모양 score[i].length 은 3x4 배열이나 4x4 배열처럼 이쁘게 2차원 배열이 생성되는 경우가 아닌 아래 코드의 경우 처럼 배열의 모양이 일정하지 않을 때에도 전체의 값을 유동적으로 가져오기 위함이다(매우 중요!!!!)
- result 는 내가 배열 안에 값이 몇개나 있는지 확인하기 위해 추가한 코드로 배열의 값이 0 이 아닌 경우 result 에 +1 하도록하여 배열 안 값의 갯수를 알 수 있게 하였다.
int[][] score = { // score 배열 선언
{100,100,100},
{20,20,20},
{30,30},
{40,40,40}
};
// 요런식의 이중 for 문은 2차원 배열 다룰 때 필수!!!!!
for(i=0; i<score.length; i++) {
// i는 0 부터 시작 socre.length 만큼 반복, 0 ~ 3
// 이때 score.length 는 배열 score 의 길이 즉 행의 수 만큼 반복된다고 생각하면 된다.
for(j=0; j<score[i].length; j++) {
// score[i].length 의 의미는 score[i] 번째 행에 있는 데이터 값의 수만큼 반복한다는 의미
// 예를 들어 score[0].length 는 score[0] 번째 행(첫째 행)에 있는 데이터들에 대해서 반복하는 것이고(총 3번)
// score[2].length 일 때는 score[2]의 데이터가 2개 밖에 없기 때문에 총 2번 반복한다.
System.out.printf("score[%d][%d] = %d \n", i, j, score[i][j] );
sum += score[i][j];
if(score[i][j]!=0) {
result+=1;
}
}
4. 2차원 배열 활용(1) : 합계, 평균
- 2차원 배열안에 있는 값의 전체 합계와 평균을 구하는 방법이다.
- 앞서 설명한 result 는 여기서 평균을 구하기 위해서 합계/전체 갯수 를 위해 계산할때 사용되도록 하였다.
static void Array_2X() {
int i, j = 0;
int sum = 0;
float avg = 0.0f;
int result=0;
int[][] score = { // score 배열 선언
{100,100,100},
{20,20,20},
{30,30},
{40,40,40}
};
// 요런식의 이중 for 문은 2차원 배열 다룰 때 필수!!!!!
for(i=0; i<score.length; i++) {
// i는 0 부터 시작 socre.length 만큼 반복, 0 ~ 3
// 이때 score.length 는 배열 score 의 길이 즉 행의 수 만큼 반복된다고 생각하면 된다.
for(j=0; j<score[i].length; j++) {
// score[i].length 의 의미는 score[i] 번째 행에 있는 데이터 값의 수만큼 반복한다는 의미
// 예를 들어 score[0].length 는 score[0] 번째 행(첫째 행)에 있는 데이터들에 대해서 반복하는 것이고(총 3번)
// score[2].length 일 때는 score[2]의 데이터가 2개 밖에 없기 때문에 총 2번 반복한다.
System.out.printf("score[%d][%d] = %d \n", i, j, score[i][j] );
sum += score[i][j];
if(score[i][j]!=0) {
// 위 배열처럼 4x3 , 4x4 의 이쁜 모양이 아닌 이상한 모양인 경우 전체 갯수를 알기위해
// 각 배열안의 값을 가져온 후 값이 0 이 아니면 result 에 +1을 더해서 전체 갯수를 알 수 있게 하였다
result+=1;
}
}
}
avg = sum/(float)result;
System.out.println("sum = "+sum);
System.out.println("result = "+result);
System.out.printf("avg = %.3f", avg);
}
5. 2차원 배열의 활용(2) : 배열을 이요한 문제풀이
- 2차원 배열을 활용한 간단한 문제 풀이를 만들어보는 코드이다.
- 말 그대로 활용이기 때문에 이정도는 쉬운듯?
- 다만 여기서 아주 중요한 것 하나!!!! String 끼리의 값을 비교하는 방법이다. String 값끼리 비교하기 위해서는 일반적인 == 가 아닌 String1.equals(String2) 의 형태를 사용한다.
static void Array_2XX() throws IOException {
String[][] question = {
{"blooean", "1"},
{"char", "2"},
{"int", "4"},
{"double", "8"}
};
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for(int i=0; i<question.length; i++) { // i 가 0 부터 3까지 돌면서 문제를 제공
bw.write("Q"+(i+1)+" "+question[i][0]+"의 byte 크기는 ? ");
// 이때 문제는 question[0][0] == blooean 의 크기는?
// question[1][0] == char 의 크기는? 으로 출력됨
bw.newLine();
bw.flush();
String answer = br.readLine();
if(answer.equals(question[i][1])) { // String 비교할때는 equals
bw.write("정답입니다");
bw.newLine();
}else {
bw.write("틀렸습니다!! 정답은 "+question[i][1] +"byte");
bw.newLine();
}
}
br.close();
bw.flush();
bw.close();
}
6. 내 맘대로 5번을 활용한 배열을 이용한 문제 풀이!!
- 조건 1. 문제는 랜덤으로 출력됨. 기존에는 무조건 blooean → char → int → double 였다면 이번에는 랜덤한 문제가 출력되어야한다.
- 조건 2. 정답을 맞추면 2점 증가, 틀리면 1점 감소한다. 최종 score가 10이 되거나 0 이상이면 종료한다.
static void Array_3XX() throws IOException {
int score = 0; // score 가 10점이 되면 종료
int ran = 0; // 랜덤 문제를 뽑기위한 변수
String[][] question = {
{"blooean", "1"},
{"char", "2"},
{"int", "4"},
{"double", "8"}
};
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
menu :
for(;;) {
for(int i=0; i<question.length; i++) {
ran = (int)(Math.random()*4); // 0 ~ 3 까지 랜덤한 값 저장
bw.write("Q"+" "+question[ran][0]+"의 byte 크기는 ? ");
bw.newLine();
bw.flush();
String answer = br.readLine();
if(answer.equals(question[ran][1])) { // String 비교할때는 equals
score+=2; // 정답이면 2점 증가
bw.write("정답입니다");
bw.write("\n score = "+score);
bw.newLine();
}else {
score-=1; // 틀리면 1점 감점
bw.write("틀렸습니다!! 정답은 "+question[ran][1] +"byte");
bw.write("\n score = "+score);
bw.newLine();
}
if((score==10) || (score>10)) { // score 가 10이거나 10보다 크면 게임 종료
bw.write("게임 종료!");
bw.flush();
break menu;
}
}
}
br.close();
bw.flush();
bw.close();
}
※ 오늘의 팁!!
1. 2차원 배열의 for 문을 돌릴때는 아래처럼!
for(i=0; i<score.length; i++) {
// i는 0 부터 시작 socre.length 만큼 반복, 0 ~ 3
// 이때 score.length 는 배열 score 의 길이 즉 행의 수 만큼 반복된다고 생각하면 된다.
for(j=0; j<score[i].length; j++) {
// score[i].length 의 의미는 score[i] 번째 행에 있는 데이터 값의 수만큼 반복한다는 의미
// 예를 들어 score[0].length 는 score[0] 번째 행(첫째 행)에 있는 데이터들에 대해서 반복하는 것이고(총 3번)
// score[2].length 일 때는 score[2]의 데이터가 2개 밖에 없기 때문에 총 2번 반복한다.
System.out.printf("score[%d][%d] = %d \n", i, j, score[i][j] );
2. String 끼리 비교할때는 equals
비교하고자하는 String값1.equals(비교하고자하는 Stirng값 2)
3. 줄바꿈 할 때는 \n 보다는 %n 사용하기!!
'Java - 기본기' 카테고리의 다른 글
14. 객체 지향 언어란? 클래스와 객체(개념편) (0) | 2021.10.17 |
---|---|
13. String 클래스, Arrays로 배열 다루기(feat. String 클래스 매서드, Arrays 클래스 매서드) (0) | 2021.10.14 |
11. String 배열의 선언과 생성, 커맨드라인에서 입력받기(feat. 가위바위보 게임) (0) | 2021.10.13 |
10. 배열 다루기 활용편 (2) : 총합, 평균, 섞기, 로또 만들기 (0) | 2021.10.11 |
9. 배열 다루기 기초편 (1) : 배열의 생성, 선언, 인덱스 (0) | 2021.10.08 |
댓글