배열로 값을 받아서 각 행마다 min값을 구하고, 그중 max값을 구하는 문제.

package newAlgorithm;

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

public class P2_숫자카드게임 {
    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 answer = Integer.MAX_VALUE;

        int [][]map = new int[n][m];
        for(int i=0;i<n;i++){
            int min = Integer.MAX_VALUE;
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<m;j++){
                map[i][j] =  Integer.parseInt(st.nextToken());
                //min값 구하기
                min = Math.min(min, map[i][j]);
            }
            answer = Math.max(answer,min);
        }

        System.out.println(answer);

    }//main
}//class

이코테 문제는 테스트케이스도 몇 개없고, 시간 메모리 확인이 어려워서 카테고리에 해당하는 다른 백준 문제를 풀기로 했다..

이것이 코딩테스트다 책을 사용해서 알고리즘 공부를 시작하기로 했다. 처음 풀어본 문제는 p.92의 큰 수의 법칙.

리스트에 값을 받아서 sort한 후, 가장 큰 수 K번, 두번째로 큰 수 1번 더해 값을 구할 수 있다. 예를 들어 K가 3일 경우, 가장 큰 수를 3번 더하고, 그 다음으로 두번째로 큰 수를 1번 더한다. M번째까지 값을 더한 후 출력하면 끝! 

처음엔 Arrays.sort를 사용해서 리스트의 마지막 값과 마지막에서 두번째 값을 사용해서 답을 구했으나 생각보다 sort 하는 시간이 긴 것 같아서 max와 secondMax값을 구해서 더해주는 것으로 코드를 수정하였다. secondMax값이 max값과 동일할 수 있기 때문에 max값이 이전과 동일할 때에도, 해당 max값으로 secondMax값을 대체해주었다.

package newAlgorithm;

import java.util.*;
import java.io.*;

public class P1_큰수의법칙{
    public static void main(String[] args) throws Exception{
        // sort해서 3번하고 1번하고 3번하고 1번하고
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;

        st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        int[] list = new int[N];

        int answer=0;
        int max=Integer.MIN_VALUE;
        int secondMax=Integer.MIN_VALUE;
        st = new StringTokenizer(br.readLine());
        for(int i=0;i<N;i++) {
            list[i] = Integer.parseInt(st.nextToken());
            if(max<=list[i]){
                secondMax = max;
                max = list[i];
            }
        }//for

//        sort사용
//        Arrays.sort(list);
//        for(int i=0;i<M;i++) {
//            if(i%(K+1)==K) {
//                answer+=list[N-2];
//            }else {
//                answer+=list[N-1];
//            }
//        }

        for(int i=0;i<M;i++) {
            if(i%(K+1)==K) {
                answer+=secondMax;
            }else {
                answer+=max;
            }
        }
        System.out.println(answer);
    }//main
}//class

+ Recent posts