티스토리 뷰

programming language/Java

자바의 정석 2차원 배열 응용문제

무니웜테일패드풋프롱스 2020. 3. 9. 12:45

1. 좌표에 X표시 

package practice01;
import java.util.*;

public class practice {
	public static void main(String[] args) {
		final int SIZE=10;
		int x= 0;
		int y=0;
		char[][] board=new char[SIZE][SIZE];
		byte[][] shipboard= {
				{0,0,0,0,0,0,1,0,0}, //0
				{0,0,1,1,0,0,0,0,0}, 
				{0,0,0,0,0,0,0,0,1},
				{0,0,0,1,0,0,0,0,0},                                                                                                                                 ㅎ
				{0,0,0,0,0,0,1,1,1},
				{0,1,1,1,0,0,0,0,0},
				{1,0,0,0,1,0,0,0,0},
				{0,0,0,0,0,0,1,0,1},
				{1,0,0,0,0,0,0,0,0}
				
		}; //배의 위치
		
		Scanner scanner=new Scanner(System.in);
		
		for(int i=1; i<SIZE; i++) {
			board[i][0]=board[0][i]=(char)(i+'0'); //1차원배열로 바로 출력할 수 있도록 저장
		}
		while(true) {
			System.out.printf("좌표를 입력하세요. (종료는 00)>");
			String input1=scanner.nextLine();
			if(input1.length()>=3) {
				System.out.println("잘못된 입력입니다. 다시입력해 주세요.");
				continue;
			}
			x=input1.charAt(0)-'0';
			y=input1.charAt(1)-'0';
			if(x==0 && y==0) break;
			if(shipboard[x-1][y-1]==1) 
				board[x][y]='O';
			else board[x][y]='X';
			

			for(int i=0; i<SIZE; i++) {
				System.out.println(board[i]); //1차원배열로 바로바로 출력  char 배열이기때문에 가능!

			}
			
		}

	}
	
}

 

char 배열의 경우 println(1차원배열) 로 간단하게 1차원배열의 내용을 모두 한줄에 담을 수 있다 . 고로 2차원배열을 출력할 때에도 2중 for문을 사용하지 않아도 된다! 

 

2. 빙고 

package practice01;
import java.util.*;

public class practice {
	public static void main(String[] args) {
		int[][] bingo=new int[5][5];
		int num=1;
		for(int i=0; i<5 ;i++) { //1부터 25까지 순서대로 저장 
			for(int j=0; j<5 ; j++)
				bingo[i][j]=num++;
		}
		
		int n1;
		int n2;
		int tmp;
		for(int i=0; i<100; i++) { 
			n1=(int)(Math.random()*5);
			n2=(int)(Math.random()*5);
			tmp=bingo[0][0];
			bingo[0][0]=bingo[n1][n2];
			bingo[n1][n2]=tmp;
		} //배열 shuffle
		
		
		for(int i=0; i<5 ; i++) { //빙고판 출력 
			for(int j=0; j<5 ;j++)
				System.out.printf("%2d " , bingo[i][j]);
			System.out.println();
		}
		
		Scanner scanner=new Scanner(System.in);
		while(true) {
			System.out.printf("1~25의 숫자를 입력하세요 (종료:0)> ");
			String str=scanner.nextLine();
			int input = Integer.parseInt(str);
			if(input==0) break; //0==종료
			if(input<1 || input>25) { //out of range
				System.out.printf("잘못입력하셨습니다. 다시입력해주세요");
				continue;
			}
			
			boolean done1=false; //행 값 빙고 여부
			boolean done2 =false; //열 값 빙고 여부 
			
			for(int i=0; i<5; i++) { //행값은 입력된 값 0으로 만들어주면서 빙고여부도 판단 
 				for(int j=0; j<5; j++) {
					if(bingo[i][j]==input) 
						bingo[i][j]=0;
					
					if(bingo[i][j]==0) 
						done2=true;
					else
						done2=false;
					
				}
				if(done2==true) break; //1빙고 되었으면 for문 탈출 
				}
				if(done2==true) { //빙고 while문 탈출 끝 
					System.out.println("BIGNO!!");
					break;
				}
				
				for(int j=0; j<5; j++) {//열값 빙고 확인 
					for(int k=0; k<5; k++) {
						if (bingo[k][j]==0) done1=true;
						else done1=false;
					}
					if(done1==true) break; //1열 빙고 -> for문 탈출
				}
				if(done1==true) { //열값 빙고-> while문 탈출 종료 
					System.out.println("BINGO!!");
					break;
				}
				
				
 			}
		for(int i=0; i<5 ; i++) { //마지막 빙고판 출력 
			for(int j=0; j<5 ;j++)
				System.out.printf("%2d " , bingo[i][j]);
			System.out.println();
		}
			
		}
	
	
}

기존 코드에서 변경사항: 행이나 열 1빙고 시 탈출!

더 응용해서 3빙고까지 count해서 3빙고되면 나오게 만들 수도 있다.

 

 

3.행렬 곱

package practice01;
//import java.util.*;
public class practice {
	
	public static void main(String[] args) {
		
		
		int[][] m1= {
				{1,2,3},
				{4,5,6} };
		
		int[][] m2= {
				{1,2},
				{3,4},
				{5,6} };
		
		final int ROW=m1.length;
		final int COL=m2[0].length;
		final int M2_ROW=m2.length;
		
		int [][] m3= new int[ROW][COL];
		
		
		for(int i=0; i< ROW; i++) { //2 
			for(int j=0; j<COL; j++) { //2
				for(int k=0; k<M2_ROW; k++) { //3 
					m3[i][j]+=m1[i][k]*m2[k][j];
				}
			}
		}
		
		for(int i=0; i<m3.length;i++) {
			for(int j=0; j<m3[i].length;j++)
				System.out.printf("%2d ", m3[i][j]);
			System.out.println();
		}
		
		
		}
}

** 행렬곱에서 나타나는 쉬운 오류는, 각 행렬의 행과 열의 길이를 리터럴 상수로 표시하는 것이다. 하지만 리터럴 상수로 나타낼 경우에는 행,렬의 길이가 달라질 경우 코드를 다 뜯어고쳐야한다는 불편함이 있기때문에, length 메서드를 통해서 각 배열의 길이를 나타내고, 그 길이를 final 상수로 저장해주면 간단하다! 사실 그냥 배열 생성할때 final 함수 빼고 length 메서드로 해줘도 되긴하는데 fianl 상수를 쓰는게 훨씬 직관적이다. 

 

4.단어 퀴즈 

package practice01;
import java.util.*;
public class practice {
	
	public static void main(String[] args) {
		String[][] Quiz= {
				{"computer", "컴퓨터"},
				{"chair", "의자"},
				{"integer","정수"}
		}; // string 3*2 two dimensional array
		
		Scanner scanner= new Scanner(System.in);
		
		for(int i=0; i< Quiz.length; i++) {
			System.out.printf("Q%d.  %s의 뜻은? ", i+1, Quiz[i][0]);
			String answer=scanner.nextLine();
			if(answer.equals(Quiz[i][1])) {
				System.out.println("정답입니다.");
			}
			else {
				System.out.println("틀렸습니다. 정답은"+Quiz[i][1]+"입니다");
			}
		}
		
	
	}
}

 1. 스트링을 2차원 배열로 선언한다.

 2. 2차원 배열의 한 행마다 "문제" "답"을 페어로 저장해준다.

** 스트링역시 2차원으로 쓸 수있다는 것을 잊지말기! 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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 26
27 28 29 30 31
글 보관함