패스트캠퍼스 데브캠프 : 남궁성의 백엔드 개발 3기

자바로 퀴즈 풀기 2주차- 패스트캠퍼스 백엔드 부트캠프 3기

Tech_JINI 2024. 12. 30. 10:24

첫 번째 퀴즈

5x5크기의 2차원 int배열을 받아서 빙고의 개수를 출력하는 bingoCount메서드를 작성하시오.

 

메서드 이름 : bingoCount

입력 : int[][] arr

출력 : int

 

// 체크된 칸은 1, 체크되지 않은 칸은 0
int[][] arr = {
     {1,1,1,1,1},
     {0,0,0,0,0},
     {0,0,0,0,0},
     {0,0,0,0,0},
     {0,0,0,0,0},
};

System.out.println(bingoCount(arr)); // 1

 

 

나의 코드

import java.util.Iterator;
import java.util.Scanner;

public class Quiz2 {
	public static void main(String[] args) {
		int[][] bing = new int[5][5];
		//int[][] bing = {{0,0,0,0,0},{0,2,5,0,0},{3,0,0,2,0},{0,0,0,7,0},{0,0,0,0,0}};
		
		
		// 0과 다른 숫자 입력받기
		Scanner scanner = new Scanner(System.in);
		
		// 2차원 배열에 집어넣기
		
		for(int x=0; x<bing.length; x++) {
			System.out.printf("(%d+1)번째 줄입니다. 0을 포함해서 5개의 숫자를 입력하세요.>>%n", x);
			for(int y=0; y<bing.length; y++) {
				bing[x][y] = scanner.nextInt();
			}
		}
		

		
		bingCount(bing);
		
	}
	
	
	// 메서드 이름 : bingoCount
	// 입력 : int[][]
	// 출력 : int 
	
	static int bingCount(int[][] arr) {
		// 뭘하지?
		// 어떻게 셀까?
		// 0만 세자 !
		int count =0;
		
		
		// 1. 가로 세기
		int count_width =0;
		
		for(int a=0; a<5; a++) {
			int count0 = 0;
			for(int b=0; b<5; b++) {
				//가로 숫자가 모두 0이라면, count_width ++;
				// 1.가로 0 세기
				// 2. 가로 0이 5개면 width +1; 
				if(arr[a][b]==0) count0++;
			}
			if(count0 == 5) count_width ++;
		}
		System.out.printf("가로 %d 빙고입니다 !%n", count_width);
		
		// 2. 세로 세기
		int count_height =0;
		for(int a=0; a<5; a++) {
			int count0 = 0;
			for(int b=0; b<5; b++) {
				
				if(arr[b][a]==0) count0++;
			}
			if(count0 == 5) count_height++;
		}
		System.out.printf("세로 %d 빙고입니다 !%n", count_height);
		
		
		// 3. 대각선 세기
		int count_cross =0;
		for(int a=0; a<5; a++) {
			int count0 = 0;
			for(int b=0; b<5; b++) {
				
			if (a==b) {
					if(arr[b][a]==0) count0++;
				}
			}
			if(count0 == 5) count_cross++;
		}
		System.out.printf("대각선 %d 빙고입니다 !%n", count_cross);
		
		
		
		
		
		count = count_height+count_width+count_cross;
		System.out.printf("총 %d 빙고입니다 !%n", count);
		
		return count;	
	}

}

 

빙고를 어느 방식으로 만드느냐에 따라 코드가 많이 달라질 것 같다.

나는 0이 모양의 빙고만 세기로 했다.

 

그리고 int형의 변수를 선언하고 0으로 초기화하여, 가로 세로 대각선의 빙고 개수를 세었다.

 

개선해 나가야 할 코드 문제

빙고 개수를 세는 비슷한 모양의 조건문을 계속 반복하여 사용했더니, 코드가 깔끔해보이지 않는다.

간략하게 쓰는 방법을 연구해야 겠다.

 

또 대각선 모양의 빙고는 ' / '모양과 ' \ '모양이 있는데 /모양의 빙고를 세는 코드를 만들지 않았다.

 

 

두 번째 퀴즈

3개의 정수를 입력받아서 두번째로 큰 수를 반환하는 mid메서드를 작성하시오.

 

메서드 이름 : mid

입력 : int x, int y, int z

출력 : int

 

나의 코드

import java.util.Arrays;
import java.util.Scanner;

public class Quiz1 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		System.out.print("숫자 3개를 입력하세요.(하나씩 쓰고 엔터치기)>> ");

		int x = sc.nextInt();
		int y = sc.nextInt();
		int z = sc.nextInt();


		mid(x,y,z);

	}
	static void mid(int x, int y, int z) {

		int max;
		int mid;
		int min;

		// 두 개를 비교(x,y) --> 작은 것과 큰것을 구분 (가장 작고, 크다고 설정)
		// 마지막 하나를 뽑음 
		// 작은 것보다 더 작으면 --> 기존의 작은 값은 mid, 뽑은 것은 min  
		// 큰 것보다 더 크면 --> 기존의 큰 값은 mid, 뽑은 것은 max
		// 위의 두가지 경우에 해당 되지 않으면 , x = mid;
		// 가운데 수를 뽑아야 함. mid 출

		if (x>y) {

			max = x;
			min = y;

			if(z<min) {

				mid = min;
				min = z;
				System.out.printf("가운데 값은 %d입니다.",mid);

			} else if(z>max) {

				mid = max;
				max = z;
				System.out.printf("가운데 값은 %d입니다.",mid);
				
			} else {
				
				mid = z;
				System.out.printf("가운데 값은 %d입니다.",mid);
			}

		} else { //x<y

			min = x;
			max = y;

			if(z<min) {

				mid = min;
				min = z;
				System.out.printf("가운데 값은 %d입니다.",mid);

			} else if (z>max) {

				mid = max;
				max = z;
				System.out.printf("가운데 값은 %d입니다.",mid);
				
			}  else {
				mid = z;
				System.out.printf("가운데 값은 %d입니다.",mid);
			}

		} //코드수 줄이기



	}

}

 

입력 받은 숫자 3개를 '가장 작은 값, 중간 값, 가장 큰 값'로 구분할 것이다.

 

구분을 위해 새로운 변수들을 선언 및 초기화하였고,

아래와 같은 방식으로 입력받은 숫자들을 구분하였다. 

 

 
두 개를 비교(x,y) --> 작은 것과 큰것을 구분 (가장 작고, 크다고 설정)
마지막 하나를 뽑음 
작은 것보다 더 작으면 --> 기존의 작은 값은 mid, 뽑은 것은 min  
큰 것보다 더 크면 --> 기존의 큰 값은 mid, 뽑은 것은 max
위의 두가지 경우에 해당 되지 않으면 , x = mid;
가운데 수를 뽑아야 함. mid 출력

 

 

개선해 나가야 할 코드 문제

이 퀴즈의 코드에도 나는 반복적으로 비슷한 모양의 반복문들을 복.붙했다. 

때문에 코드 길이가 굉장히 길어보인다. 

 

길어보이는 것 뿐만 아니라 실제로 반복문을 중첩 사용하였기 때문에 시간복잡도도 꽤 높다.

 

반복문의 남용하지 말 것. 반복해서 사용하게 될 때 메서드화 시켜, 코드 길이를 줄일 것.

나는 아직 메서드 만드는 것에 익숙하지 않아, 이런 문제들이 발생하게 되는 것 같다.