첫 번째 퀴즈
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 출력
개선해 나가야 할 코드 문제
이 퀴즈의 코드에도 나는 반복적으로 비슷한 모양의 반복문들을 복.붙했다.
때문에 코드 길이가 굉장히 길어보인다.
길어보이는 것 뿐만 아니라 실제로 반복문을 중첩 사용하였기 때문에 시간복잡도도 꽤 높다.
반복문의 남용하지 말 것. 반복해서 사용하게 될 때 메서드화 시켜, 코드 길이를 줄일 것.
나는 아직 메서드 만드는 것에 익숙하지 않아, 이런 문제들이 발생하게 되는 것 같다.
'패스트캠퍼스 데브캠프 : 남궁성의 백엔드 개발 3기' 카테고리의 다른 글
MyPoint클래스, MyVector클래스 연습문제 회고 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.17 |
---|---|
자바 목차 테스트 (2) | 2025.01.15 |
자바의 정석 챕터6, 7 연습문제 회고 - 패스트캠퍼스 백엔드 부트캠프 3기 (2) | 2025.01.10 |
자바의 정석 챕터1~5 연습문제 회고 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.06 |
자바로 퀴즈 풀기 - 패스트캠퍼스 백엔드 부트캠프 3기 (1) | 2024.12.23 |