숫자 카드 게임

Eunkyung·2021년 12월 23일
0

Algorithm

목록 보기
29/30

여러 개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한 장을 뽑는 문제인데, 각 행에서 가장 숫자가 낮은 카드를 뽑아서 최종적으로 가장 높은 숫자의 카드를 뽑아야 한다.

2차원 배열로 카드의 숫자가 주어지고 n과 m이 100이하여서 2중 루프로 최솟값을 찾아서 리스트에 저장한 후 최댓값을 출력하도록 구현하였다. 2차원 배열로 자연수가 주어져서 당연히 2차원 배열에 대한 풀이를 시도하였는데 꼭 2차원 배열로 풀지 않아도 되는 것을 보고 충격먹었다.

첫 번째 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class 숫자카드게임 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        ArrayList<Integer> list = new ArrayList<>();
        int n = Integer.parseInt(st.nextToken()); // 행
        int m = Integer.parseInt(st.nextToken()); // 열
        int[][] cardArr = new int[n][m];
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < m; j++) {
                cardArr[i][j] = Integer.parseInt(st.nextToken());
                int minNum = cardArr[i][0];
                if (cardArr[i][j] < minNum) { // 각 행에서 최솟값 찾아서
                    minNum = cardArr[i][j];
                    list.add(minNum); // 리스트에 저장
                }
            }
        }
        Collections.sort(list);
        System.out.println(list.get(list.size() - 1)); // 찾은 최솟값 중 최댓값 출력
    }
}
두 번째 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 숫자카드게임 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()); // 행
        int m = Integer.parseInt(st.nextToken()); // 열
        int result = 0;
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int minNum = 10001;
            for (int j = 0; j < m; j++) {
                int cardNum = Integer.parseInt(st.nextToken());
                minNum = Math.min(minNum, cardNum); // 현재 줄에서 가장 작은 수 찾기
            }
            result = Math.max(result, minNum); // 작은 수 중에서 큰 수 찾기
        }
        System.out.println(result);
    }
}

행의 개수만큼 숫자를 입력받아서 열의 개수만큼 min() 메소드를 사용해서 최솟값을 갱신해주었고 행의 개수만큼 반복하면서 result 변수에 최댓값을 저장해주었다.

하나의 문제에 대해서 다양한 풀이가 있는 걸 보면서 항상 감탄한다. 문제 풀기 전 깊게 생각해보는 습관을 가져야겠다.

profile
꾸준히 하자

0개의 댓글