백준 7795

송민지·2025년 9월 15일

알고리즘

목록 보기
10/10

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의 값이 변하지 않았습니다.

이중 for문

이 문제의 유형은 투 포인트 였는데, 시간초과가 나서 통과에는 실패하였습니다.
배열을 정렬하여 투 포인트로 변경하였더니 통과되었습니다.

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;
    }
}
profile
항상 밝게

0개의 댓글