Codeforces Round #719 (Div. 3) 참가 후기

axiom·2021년 5월 7일
0

Codeforces Round #719 (Div.3)

배치고사 5판이 끝나고 처음으로 보는 코드포스. 아이언은 턱걸이로 일단 탈출했다. 총 3문제를 풀었는데 D부터는 풀이가 정말 상상도 못하는 방법이었기 때문에 아쉽지는 않다. 문제를 좀 더 빨리 풀지 못한것이 아쉽다.

A. Do Not Be Distracted!

문제를 읽다 보니 한번 어떤 일이 끝나면 다시 일을 할 수 없다고 하는데 그러면 한번 나왔던게 다시 안나오는지만 확인해 주면 되겠다. 문제 전부 안 읽고 대충 예상해서 4분만에 맞췄다!

public class A {
 
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder ans = new StringBuilder();
		int TC = Integer.parseInt(br.readLine());
		for (int tc = 0; tc < TC; tc++) {
			int N = Integer.parseInt(br.readLine());
			boolean[] check = new boolean[26];
			String S = br.readLine();
			boolean ok = true;
			for (int i = 0; i < N; i++) {
				int ch = S.charAt(i) - 'A';
				if (check[ch] && S.charAt(i) != S.charAt(i - 1)) ok = false;
				check[ch] = true;
			}
			ans.append(ok ? "YES" : "NO").append("\n");
		}
		System.out.print(ans);
	}
 
}

B. Ordinary Numbers

모든 자리수가 같은 숫자를 ordinary number라고 하고 nn이하의 ordinary number를 모두 구하는 건데 대충 생각하고 111...111... 꼴만 계속 더해나가면 되는줄 알고 제출한다음에 C로 넘어갔었다. 그런데 큐에서 한 15분 후에 채점이 돌아가더니 바로 틀렸다... 원인은 자리수가 바뀔때마다 111...111...꼴에서 다시 시작해야하는데 계속 더해서만 그런거였다. 그런데 이거 고치겠다고 급하게 제출하다가 디버깅 출력문도 안고치고 내고 이런식으로 해서 3번 더 틀렸다 30분 낭비한건 덤. 코드가 너무 복잡해지면 멈추고 생각을 정리한다음에 다시 써도 늦지 않는다는 것을 깨달았다.

public class B {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder ans = new StringBuilder();
		int TC = Integer.parseInt(br.readLine());
		int[] d = {1, 11, 111, 1111, 11111, 111111, 1111111, 11111111, 111111111, 1111111111};
		for (int tc = 0; tc < TC; tc++) {
			int N = Integer.parseInt(br.readLine());
			int cnt = 0; int i = 1;
			while (i <= N) {
				if (i % 10 == 9) i = d[String.valueOf(i).length()];
				else i += d[String.valueOf(i).length() - 1];
				cnt++;
			}
			ans.append(cnt).append("\n");
		}
		System.out.print(ans);
	}
	
}

C. Not Adjacent Matrix

1부터 n2n^2까지 정수들 n2n^2배열에 나열한다. 단 인접한 위치는 최소 2이상 차이가 나야 한다. 가능한 배치를 출력하는 문제
우선 손으로 해보다가 123 654 ... 이런 꼴은 안된다는 것을 깨달았고, 맨 윗줄만 완성시키면 아래로는 행렬의 행 수만큼 더하면서 만들면 된다는 것을 깨달았다. 맨 윗줄은 n=4n=4까지는 24132413으로 가능한데, 그 다음부터는 그냥 어느쪽에 붙여도 상관이 없었다.

public class C {
	static final String[] example = {"", "1", "-1", "2 9 7\n4 6 3\n1 8 5"};
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int TC = Integer.parseInt(br.readLine());
		for (int tc = 0; tc < TC; tc++) {
			int N = Integer.parseInt(br.readLine());
			if (N <= 3) System.out.println(example[N]);
			else {
				Deque<Integer> dq = new LinkedList<>();
				dq.offer(2); dq.offer(4); dq.offer(1); dq.offer(3);
				for (int i = 0; i < N - 4; i++) {
					if (i % 2 == 0) dq.offerFirst(i + 5);
					else dq.offerLast(i + 5);
				}
				for (int i = 0; i < N; i++) {
					StringBuilder ans = new StringBuilder();
					for (int x : dq) ans.append(x + N * i).append(" ");
					System.out.println(ans.toString().trim());
				}
			}
		}
	}
	
}
profile
반갑습니다, 소통해요

0개의 댓글