코테/코드트리
[코드트리/NOVICE MID] 선두를 지켜라 (JAVA)
imname1am
2023. 11. 2. 12:37
반응형
🔺 문제
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import java.util.*;
import java.io.*;
public class Main {
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[] arr1 = new int[1_000_001];
int pos1 = 0;
int time1 = 0;
int[] arr2 = new int[1_000_001];
int pos2 = 0;
int time2 = 0;
while(N --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int speed = Integer.parseInt(st.nextToken());
int time = Integer.parseInt(st.nextToken());
for(int j = 0 ; j < time ; j++) {
pos1 += speed;
arr1[++time1] = pos1;
//System.out.println("arr1 : " + time1 + " " + pos1);
}
}
while(M --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int speed = Integer.parseInt(st.nextToken());
int time = Integer.parseInt(st.nextToken());
for(int j = 0 ; j < time ; j++) {
pos2 += speed;
arr2[++time2] = pos2;
//System.out.println("arr2 : " + time2 + " " + pos2);
}
}
int cnt = 0;
int[] first = new int[time1 + 1];
for(int i = 1 ; i < first.length ; i++) {
if(arr1[i] >= arr2[i]) {
first[i] = 1;
}
else {
first[i] = 2;
}
}
// 우선순위 바뀌는 시점의 갯수 세기
for(int i = 1 ; i < time1 ; i++) {
if(first[i] != first[i + 1]) {
cnt++;
}
}
System.out.println(cnt);
}
}
|
cs |
🧩 해결 아이디어
• 배열 기록
1) A와 B 배열의 값을 시간에 따라 이동한 위치를 따로 기록한다.
2) 우선순위를 저장하는 배열 first를 하나 만든다.
A 배열의 값이 B 배열의 같은 위치에 있는 값보다
ㄴ 크거나 같다면 우선순위 저장 배열에 1을,
ㄴ작다면 우선순위 저장 배열에 2를 저장한다.
3) 우선순위 저장 배열을 돌면서, 값이 바뀌는 시점의 갯수를 센다.
🔺 다른 풀이들
import java.util.Scanner;
public class Main {
public static final int MAX_T = 1000000;
public static int n, m;
public static int[] posA = new int[MAX_T + 1];
public static int[] posB = new int[MAX_T + 1];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
// A 기록
int timeA = 1;
for(int i = 0; i < n; i++) {
int v = sc.nextInt();
int t = sc.nextInt();
while(t-- > 0) {
posA[timeA] = posA[timeA - 1] + v;
timeA++;
}
}
// B 기록
int timeB = 1;
for(int i = 0; i < m; i++) {
int v = sc.nextInt();
int t = sc.nextInt();
while(t-- > 0) {
posB[timeB] = posB[timeB - 1] + v;
timeB++;
}
}
// A와 B 중 더 앞서 있는 경우 확인 (A가 리더면 1, B가 리더면 2)
int leader = 0, ans = 0;
for(int i = 1; i < timeA; i++) {
if(posA[i] > posB[i]) {
if(leader == 2) // 기존 리더가 B였다면, 답 갱신
ans++;
leader = 1; // 리더를 A로 변경
}
else if(posA[i] < posB[i]) {
if(leader == 1) // 기존 리더가 A였다면, 답 갱신
ans++;
leader = 2; // 리더를 B로 변경
}
}
System.out.print(ans);
}
}
💬 느낀 점
빨리 풀 수 있었는디 ..
역시 결과를 중간중간 출력해봐야 어디서 틀렸는지 알 수 있는 것 같다!
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
반응형