알고리즘/백준
[백준] 그래픽스 퀴즈 - 2876
nagrang
2024. 4. 23. 14:45
1. 문제
2. 접근
입력값이 최대 10만이고 그래이드는 5개이므로 O(5n)으로 풀면 되지 않을까 생각했다.
처음 접근은 이전의 그레이드와 현재 그레이드를 비교해서 연속하면 누적 카운트를 더해주고, 연속이 끊기면 누적 카운트를 맥스값과 비교해서 갱신한 후 누적값을 초기화 시키는 것이었다.
하지만 틀렸다!
더 좋은 방법은 2차원 배열로 student[6][N]를 만들어서 진행하는 것이다. 처음 student 배열을 0으로 모두 초기화한 후, 차례대로 N번 루프를 돈다. 이때 n은 책상의 수로 입력으로 주어지는 n책상에 대한 그레이드 정보를 이용한다.
grage1, grade2를 알아낸 후 이전의 값에 1을 더한다. 누적값을 알아야 하므로 이렇게 하면 변수 하나로 누적값을 관리할 수 있다. 그리고 연결이 끊겼을 경우에 student 배열을 모두 0으로 초기화했으므로 별다른 로직이 없어도 잘 작동된다.
for(int i=0; i<N; i++){
String [] nums = br.readLine().split(" ");
int grade1 = Integer.parseInt(nums[0]);
int grade2 = Integer.parseInt(nums[1]);
grade[grade1][i] = grade[grade1][i-1] + 1;
grade[grade2][i] = grade[grade2][i-1] + 1;
}
전체코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int grade [][] = new int [6][N];
for(int i=0; i<N; i++){
String [] nums = br.readLine().split(" ");
int grade1 = Integer.parseInt(nums[0]);
int grade2 = Integer.parseInt(nums[1]);
if(i == 0){
grade[grade1][i] = 1;
grade[grade2][i] = 1;
continue;
}
grade[grade1][i] = grade[grade1][i-1] + 1;
grade[grade2][i] = grade[grade2][i-1] + 1;
}
int maxCount = 0;
int maxGrage = 1;
// max 구하기
for(int i=0; i<N; i++){
for(int g = 1; g <=5; g++){
if(grade[g][i] > maxCount){
maxCount = grade[g][i];
maxGrage = g;
}
}
}
System.out.println(maxCount +" " + maxGrage);
}
}