본문 바로가기
PS/CodeForces

CodeForces 1569B - Chess Tournament (Java)

by Nahwasa 2021. 11. 27.

문제 : https://codeforces.com/contest/1569/problem/B

 

 

1. 타입1인 사람에 대해 다른 모든 사람들과 무승부처리를 함 (22, 23 line)

 

2. 동시에 타입2인 사람을 별도로 list로 관리함 (26 line)

 

3. 그럼 위의 과정으로 일단 타입1인 사람들은 이제 신경 쓸 필요가 없어짐. 그리고 타입2인 사람들에 대해서만 생각해보면 되는데, 타입2인 사람이 0명이면 그냥 첫번째 과정 거친거 출력하면 끝임.

타입2인 사람이 1명이거나 2명뿐인 경우 조건을 만족할수가 없음. 이 경우가 'NO'가 됨.

타입2가 3명 이상인 경우, 서로 돌아가면서 져주면 됨.

 

4. 내 경우엔 예를들어 A, B, C, D 라는 타입2인 사람이 있다면 일단 마지막 D가 A를 이긴걸로 침. (36~37 line)

이후로는 A>B, B>C, C>D 이렇게 순서대로 이기게 해줌. (40 line)

그럼 일단 모든 타입에 대해 만족하는 배열을 만들 수 있으니 이걸 출력하면 됨. 남는 칸은 (위의 경우 A와 C의 경기는 없었음) 그냥 무승부 처리해버리면 됨 (51 line)

 

 

 

코드 : github

import java.io.DataInputStream;
import java.io.IOException;
import java.util.ArrayList;
 
public class Main {
   public static void main(String[] args) throws Exception {
       initFI();
       int tc = nextInt();
       StringBuilder sb = new StringBuilder();
       while (tc-->0) {
           int n = nextInt();
           String s = nextLine();
           char[][] arr = new char[n][n];
           for (int i = 0; i < n; i++)
               arr[i][i] = 'X';
 
           ArrayList<Integer> list = new ArrayList<>();
           for (int i = 0; i < n; i++) {
               if (s.charAt(i) == '1') {
                   for (int k = 0; k < n; k++) {
                       if (i == k) continue;
                       arr[i][k] = '=';
                       arr[k][i] = '=';
                   }
               } else {
                   list.add(i);
               }
           }
 
           if (list.size() == 1 || list.size() == 2) {
               sb.append('N').append('O').append('\n');
               continue;
           }
 
           if (list.size() != 0) {
               int last = list.get(list.size() - 1);
               int first = list.get(0);
               arr[last][first] = '+';
               arr[first][last] = '-';
               for (int i = 1; i < list.size(); i++) {
                   int bf = list.get(i - 1);
                   int cur = list.get(i);
                   arr[bf][cur] = '+';
                   arr[cur][bf] = '-';
               }
           }
 
           sb.append('Y').append('E').append('S').append('\n');
           for (int i = 0; i < n; i++) {
               for (int j = 0; j < n; j++) {
                   sb.append(arr[i][j] == 0 ? '=' : arr[i][j]);
               }
               sb.append('\n');
           }
       }
       System.out.println(sb);
   }
 
    private static final int DEFAULT_BUFFER_SIZE = 1 << 16;
    private static DataInputStream inputStream;
    private static byte[] buffer;
    private static int curIdx, maxIdx;
 
    private static void initFI() {
        inputStream = new DataInputStream(System.in);
        buffer = new byte[DEFAULT_BUFFER_SIZE];
        curIdx = maxIdx = 0;
    }
 
    private static String nextLine() throws IOException {
        byte[] buf = new byte[64]; // line length
        int cnt = 0, c;
        while ((c = read()) != -1) {
            if (c == '\n') {
                if (cnt != 0) break;
                continue;
            }
            buf[cnt++] = (byte)c;
        }
        return new String(buf, 0, cnt);
    }
 
    private static int nextInt() throws IOException {
        int ret = 0;
        byte c = read();
        while (c <= ' ') c = read();
        boolean neg = (c == '-');
        if (neg) c = read();
        do {
            ret = ret * 10 + c - '0';
        } while ((c = read()) >= '0' && c <= '9');
        if (neg) return -ret;
        return ret;
    }
 
    private static byte read() throws IOException {
        if (curIdx == maxIdx) {
            maxIdx = inputStream.read(buffer, curIdx = 0, DEFAULT_BUFFER_SIZE);
            if (maxIdx == -1) buffer[0] = -1;
        }
        return buffer[curIdx++];
    }
}

댓글