Post

Codeforces Round 970 (Div. 3) Reviews

Codeforces Round 970 (Div. 3) Reviews

Problem A

Submission

Code

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
/**
 * Author : nowalex322, KimHyeonJae
 */
import java.io.*;
import java.util.*;

public class SakurakoExam {
    static BufferedReader br;
    static StringTokenizer st;

    public static void main(String[] args) throws IOException {
//        br = new BufferedReader(new InputStreamReader(System.in));
        br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));

        int t = Integer.parseInt(br.readLine());

        for (int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            if (makeZero(a, b)) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }

        br.close();
    }

    public static boolean makeZero(int a, int b) {
        for (int i = -a; i <= a; i += 2) {
            for (int j = -2*b; j <= 2*b; j += 4) {
                if (i + j == 0) {
                    return true;
                }
            }
        }
        return false;
    }
}

Problem B

Submission

Code

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
/**
 * Author : nowalex322, KimHyeonJae
 */
import java.io.*;
import java.util.*;

public class SquareOrNot {
    static BufferedReader br;
    static StringTokenizer st;

    public static void main(String[] args) throws IOException {
        // br = new BufferedReader(new InputStreamReader(System.in));
        br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));
        
        int t = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < t; i++) {
            int n = Integer.parseInt(br.readLine());
            String s = br.readLine();
            sb.append(squareOrNot(n, s) ? "Yes\n" : "No\n");
        }

        System.out.print(sb);
        br.close();
    }

    private static boolean squareOrNot(int n, String s) {
        int sqrtN = (int) Math.sqrt(n);
        
        // 제곱수 먼저 확인
        if (sqrtN * sqrtN != n) return false;

        // 가로 모서리 확인
        for (int i = 0; i < sqrtN; i++) {
            if (s.charAt(i) != '1' || s.charAt(n - sqrtN + i) != '1') return false;
        }
        
        // 세로 모서리 확인
        for (int i = 0; i < sqrtN; i++) {
            if (s.charAt(i * sqrtN) != '1' || s.charAt((i + 1) * sqrtN - 1) != '1') {
                return false;
            }
        }

        // 내부 0 확인
        if (sqrtN > 2) {
            for (int i = 1; i < sqrtN - 1; i++) {
                for (int j = 1; j < sqrtN - 1; j++) {
                    if (s.charAt(i * sqrtN + j) != '0') {
                        return false;
                    }
                }
            }
        }

        return true;
    }
}

Problem C

Submission

Code

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
/**
 * Author : nowalex322, KimHyeonJae
 */
import java.io.*;
import java.util.*;

public class LongestGoodArray {
    static BufferedReader br;
    static StringTokenizer st;

    public static void main(String[] args) throws IOException {
        // br = new BufferedReader(new InputStreamReader(System.in));
        br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));

        int t = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < t; i++) {
            String[] input = br.readLine().split(" ");
            long l = Long.parseLong(input[0]);
            long r = Long.parseLong(input[1]);

            long maxLen = 0;
            long current = l;
            long difference = 1; // 처음 차이는 1로 설정

            while (current <= r) {
                maxLen++;
                current += difference;
                difference++;
            }

            sb.append(maxLen).append("\n");
        }

        System.out.print(sb.toString());

        br.close();
    }
}

Problem D

Submission

Code

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
64
65
66
67
68
69
70
/**
 * Author : nowalex322, KimHyeonJae
 */
import java.io.*;
import java.util.*;

public class SakurakoHobby {
    static BufferedReader br;
    static StringTokenizer st;
    static int n, p[], F[];
    static boolean[] visited;

    public static void main(String[] args) throws IOException {
        // br = new BufferedReader(new InputStreamReader(System.in));
        br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));

        int t = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        while (t-- > 0) {
            n = Integer.parseInt(br.readLine()); // 순열의 크기
            p = new int[n]; // 순열 p
            visited = new boolean[n];
            F = new int[n];

            st = new StringTokenizer(br.readLine());
            
            for (int i = 0; i < n; i++) {
                p[i] = Integer.parseInt(st.nextToken()) - 1;
            }

            String s = br.readLine();

            for (int i = 0; i < n; i++) {
                if (!visited[i]) {
                    List<Integer> list = new ArrayList<>();
                    int current = i;

                    // 사이클을 탐색하면서 방문하지 않은 정점들을 기록
                    while (!visited[current]) {
                        visited[current] = true;
                        list.add(current);
                        current = p[current];
                    }

                    // 해당 사이클 내의 검정색 숫자 개수 카운트
                    int cnt = 0;
                    for (int idx : list) {
                    	// 색상이 검정색(0)인 경우 카운트++
                        if (s.charAt(idx) == '0') cnt++;
                    }

                    // 사이클 내의 모든 정점에 대해 F 값을 동일하게 설정 - 메모이제이션
                    for (int idx : list) {
                        F[idx] = cnt;
                    }
                }
            }

            // 결과를 StringBuilder에 추가하여 출력 속도 최적화
            for (int i = 0; i < n; i++) {
                sb.append(F[i]).append(" ");
            }
            sb.append("\n");
        }

        System.out.print(sb.toString());
        br.close();
    }
}

Problem F

Submission

Code

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
64
65
/**
 * Author : nowalex322, KimHyeonJae
 */
import java.io.*;
import java.util.*;

public class SakurakoBox {
    static BufferedReader br;
    static StringTokenizer st;
    private static final int MOD = 1000000007;

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));

        int t = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        while (t-- > 0) {
            int n = Integer.parseInt(br.readLine());  // 배열의 크기
            String[] tokens = br.readLine().split(" ");
            long[] a = new long[n];
            long sum = 0;
            for (int i = 0; i < n; i++) {
                a[i] = Long.parseLong(tokens[i]);
                sum = (sum + a[i]) % MOD;
            }

            long result = 0;
            for (int i = 0; i < n; i++) {
                sum = (sum - a[i] + MOD) % MOD;
                result = (result + a[i] * sum) % MOD;
            }

            // 두 개의 공을 선택하는 조합의 수는 nC2 = n * (n-1) / 2!
            long combinationCount = (long) n * (n - 1) / 2 % MOD;

            // 기대값 계산: P * Q^(-1) % MOD
            long expectedValue = result * modInverse(combinationCount, MOD) % MOD;

            sb.append(expectedValue).append("\n");
        }

        System.out.print(sb.toString());
        br.close();
    }

    // 모듈러 역수를 계산하는 함수 (페르마의 소정리 이용)
    private static long modInverse(long a, int mod) {
        return power(a, mod - 2, mod);
    }

    // 거듭제곱을 계산하는 함수
    private static long power(long a, long b, int mod) {
        long result = 1;
        while (b > 0) {
            if ((b & 1) == 1) {
                result = result * a % mod;
            }
            a = a * a % mod;
            b >>= 1;
        }
        return result;
    }
}

Problem E (Failed)

Submission

Code

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
/**
 * Author : nowalex322, KimHyeonJae
 */
import java.io.*;
import java.util.*;

public class AlternatingString {
    static BufferedReader br;
    static BufferedWriter bw;
    static StringBuilder sb;

    public static void main(String[] args) throws IOException {
        br = new BufferedReader(new InputStreamReader(System.in));
        br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt")));
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
        sb = new StringBuilder();

        int t = Integer.parseInt(br.readLine());
        while (t-- > 0) {
            solve();
        }
        
        bw.write(sb.toString());
        bw.flush();
        br.close();
        bw.close();
    }

    static void solve() throws IOException {
        int n = Integer.parseInt(br.readLine());
        String s = br.readLine();
        
        if (n % 2 == 1) {  // 홀수 길이 문자열 처리
            int[][] cnt = new int[2][26];
            for (int i = 0; i < n - 1; ++i) {
                cnt[i % 2][s.charAt(i) - 'a']++;
            }
            int ans = Arrays.stream(cnt[0]).max().getAsInt() + Arrays.stream(cnt[1]).max().getAsInt();
            for (int i = n - 2; i >= 0; i--) {
                cnt[i % 2][s.charAt(i) - 'a']--;
                cnt[(i + 1) % 2][s.charAt(i + 1) - 'a']++;
                ans = Math.max(ans, Arrays.stream(cnt[0]).max().getAsInt() + Arrays.stream(cnt[1]).max().getAsInt());
            }
            sb.append(n - ans).append('\n');
        } else {  // 짝수 길이 문자열 처리
            int[][] cnt = new int[2][26];
            for (int i = 0; i < n; ++i) {
                cnt[i % 2][s.charAt(i) - 'a']++;
            }
            int maxEven = Arrays.stream(cnt[0]).max().getAsInt();
            int maxOdd = Arrays.stream(cnt[1]).max().getAsInt();
            sb.append(n - maxEven - maxOdd).append('\n');
        }
    }
}

Overall Review

Div.3 난이도라 생각보다 괜찮았고 재밌게 풀어봤다.

This post is licensed under CC BY 4.0 by the author.