Java - 기본기

12. 2차원 배열 기초 & 활용(feat. String 값 비교하기 & 2차원 배열을 활용한 문제 만들기)

TerianP 2021. 10. 14.
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 사용하기!!

댓글