문제 : 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++];
}
}
'PS > CodeForces' 카테고리의 다른 글
CodeForces 1614B - Divan and a New Project (Java) (0) | 2021.11.27 |
---|---|
CodeForces 1593A - Elections (Java) (0) | 2021.11.27 |
CodeForces 1569A - Balanced Substring (Java) (0) | 2021.11.27 |
CodeForces 1567A - Domino Disaster (Java) (0) | 2021.11.27 |
CodeForces 4A - Watermelon (Java) (0) | 2021.11.27 |
댓글