Skip to content

Commit 0df197a

Browse files
committed
[20438] 출석체크
1 parent 7ca04fc commit 0df197a

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

Diff for: 방장코더/2주차/BOJ_20438.java

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package DYKA2.두번째;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.List;
9+
import java.util.StringTokenizer;
10+
11+
public class BaekJoon20438 {
12+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13+
private static int[] student;
14+
private static boolean[] visited;
15+
16+
public static void main(String[] args) throws IOException {
17+
18+
StringTokenizer st = new StringTokenizer(br.readLine());
19+
20+
int size = Integer.parseInt(st.nextToken()) + 3; // 학생 수
21+
int sleepStudentSize = Integer.parseInt(st.nextToken()); // 졸고 있는 학생 수
22+
int sendCodeSize = Integer.parseInt(st.nextToken()); // 출석 코드를 보내는 횟수
23+
int rangeSize = Integer.parseInt(st.nextToken()); // 주어질 범위의 횟수
24+
25+
student = new int[size];
26+
visited = new boolean[size];
27+
28+
// 모든 학생은 1 로 마킹해준다.
29+
Arrays.fill(student, 1);
30+
student[0] = 0;
31+
student[1] = 0;
32+
student[2] = 0;
33+
34+
// 졸고 있는 학생의 번호는 방문처리해준다.
35+
st = new StringTokenizer(br.readLine());
36+
for (int i = 0; i < sleepStudentSize; i++) {
37+
visited[Integer.parseInt(st.nextToken())] = true;
38+
}
39+
40+
// 출석 문자를 보낸 학생의 배수를 0으로 바꿔준다.
41+
st = new StringTokenizer(br.readLine());
42+
for (int i = 0; i < sendCodeSize; i++) {
43+
int number = Integer.parseInt(st.nextToken());
44+
45+
if (visited[number]) continue;
46+
47+
for (int j = number; j < size; j += number) {
48+
if (visited[j]) continue;
49+
student[j] = 0;
50+
}
51+
52+
}
53+
54+
// 학생 누적합 구하기
55+
int[] sum = new int[size];
56+
for (int i = 3; i < size; i++) {
57+
sum[i] = sum[i - 1] + student[i];
58+
}
59+
60+
// 범위의 결과값 출력하기
61+
for (int i = 0; i < rangeSize; i++) {
62+
st = new StringTokenizer(br.readLine());
63+
int startIndex = Integer.parseInt(st.nextToken());
64+
int endIndex = Integer.parseInt(st.nextToken());
65+
66+
System.out.println(sum[endIndex] - sum[startIndex - 1]);
67+
}
68+
69+
}
70+
71+
}

Diff for: 방장코더/2주차/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020

2121
#### 👉 접근법
2222

23-
- 문제 이해 못 하는 중...
23+
- 방문처리로 누적합을 구하는 방식으로 접근하였다.
2424

2525
#### ⏳ 시간복잡도
2626

27-
- ...
27+
- 구간합을 사용하여 O(1)의 시간 복잡도를 가진다
2828

2929

3030
<br>

0 commit comments

Comments
 (0)