https://www.acmicpc.net/problem/7795
코드를 수정하면서
for (int i = 0; i < a; i++) {
while (j < b && m[j] < n[i]) {
j++;
cnt += j;
}
}
이렇게 작성을 했는데, cnt의 값이 변화는 문제가 있었습니다.
중괄호를 지우고 j++만 소괄호 옆에 위치시키니 cnt의 값이 변하지 않았습니다.
이 문제의 유형은 투 포인트 였는데, 시간초과가 나서 통과에는 실패하였습니다.
배열을 정렬하여 투 포인트로 변경하였더니 통과되었습니다.
처음에 cnt는 while문 밖에 위치했었습니다.
그런데 cnt의 값이 합산되어 나오는 문제가 있어서 위치를
for (int i = 0; i < a; i++) {
while (j < b && m[j] < n[i]) {
j++;
cnt += j;
}
}
이 코드 위로 변경하였습니다. 생각해보니 while문 밖에 위치하여 cnt의 값이 누적될 수밖에 없어 과대계산이 될 수밖에 없었습니다.
public class B7795 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int t = Integer.parseInt(br.readLine()); //테스트 케이스
while (t-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int[] n = new int[a];
int[] m = new int[b];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < a; i++) {
n[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
for (int i = 0; i < b; i++) {
m[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(n);
Arrays.sort(m);
System.out.println(count(sb, n, m, a, b));
}
}
public static int count(StringBuilder sb, int[] n, int[] m, int a, int b) {
int cnt = 0;
int j = 0;
for (int i = 0; i < a; i++) {
while (j < b && m[j] < n[i]) j++;
cnt += j;
}
sb.append(cnt).append("\n");
return cnt;
}
}