스코페 2021 공지 https://www.wanted.co.kr/events/scofe2021
내 생애 첫 코딩 테스트(?)였던 스코페 2021 후기를 이제서야 기록해보려 한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int max_start = Integer.MIN_VALUE;
int min_end = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
String time = br.readLine();
String start = time.substring(0, 2) + time.substring(3, 5);
int start_time = Integer.parseInt(start);
String end = time.substring(8, 10) + time.substring(11, 13);
int end_time = Integer.parseInt(end);
if (max_start < start_time) max_start = start_time;
if (min_end > end_time) min_end = end_time;
}
if (max_start > min_end) { // 겹치는 부분이 없는 경우
System.out.println(-1);
} else {
String start_hour = String.valueOf(max_start / 100);
if (start_hour.length() == 1) start_hour = "0" + start_hour;
String start_minute = String.valueOf(max_start % 100);
if (start_minute.length() == 1) start_minute = "0" + start_minute;
String end_hour = String.valueOf(min_end / 100);
if (end_hour.length() == 1) end_hour = "0" + end_hour;
String end_minute = String.valueOf(min_end % 100);
if (end_minute.length() == 1) end_minute = "0" + end_minute;
System.out.println(start_hour + ":" + start_minute + " ~ " + end_hour + ":" + end_minute);
}
}
}
중복되는 구간이 있는지 확인하는 단순 구현 문제였다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] visit = new int[n];
int[] dp = new int[n];
String line = br.readLine();
for (int i = 0; i < n; i++) {
visit[i] = Integer.parseInt(String.valueOf(line.charAt(i)));
}
dp[0] = visit[0];
dp[1] = visit[1];
for (int i = 2; i < n; i++) {
if (visit[i] == 0) {
dp[i] = 0;
} else {
dp[i] = dp[i - 2] + dp[i - 1];
}
}
System.out.println(dp[n - 1]);
}
}
끝까지 도달할 수 있는 경우의 수를 구하는 DP 문제였다.
import java.io.*;
class Main {
static int n;
static int[][] map;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
map = new int[n][n];
int[] size_total = new int[n + 1];
int total = 0;
for (int i = 0; i < n; i++) {
String line = br.readLine();
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(String.valueOf(line.charAt(j)));
}
}
size_total[1] = getSizeOne();
total += size_total[1];
for (int size = 2; size <= n; size++) {
size_total[size] = 0;
for (int i = 0; i <= n - size; i++) {
for (int j = 0; j <= n - size; j++) {
if (map[i][j] == 1) { // 시작점으로 할 수 있다면
if (makeRec(size, i, j)) { // 사각형을 만들 수 있다면
size_total[size]++;
}
}
}
}
total += size_total[size];
}
System.out.println("total: " + total);
for (int i = 1; i <= n; i++) {
if (size_total[i] != 0) {
System.out.println("size[" + i + "]: " + size_total[i]);
}
}
}
public static int getSizeOne() {
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (map[i][j] == 1) {
cnt++;
}
}
}
return cnt;
}
public static boolean makeRec(int size, int start_i, int start_j) {
for (int i = start_i; i < size + start_i; i++) {
for (int j = start_j; j < size + start_j; j++) {
if (map[i][j] == 0) { // 못 만든다면
return false;
}
}
}
return true;
}
}
삼중 반복문을 통해 답을 구할 수 있다고 하였는데 나는 다소 복잡하게 푼 것 같다..
문제 4,5,6번은 풀긴 했지만 맞았는지 확실하지 않아서 코드는 올리지 않겠다.
데이터를 알맞은 자료구조로 정의하고 정렬하는 것이 문제였다. 이 문제를 풀다가 헷갈리는 바람에 시간이 다 가버려서 자료구조 다루는 실력이 아직 부족하다고 느껴졌다.
dfs로 풀긴 했는데 시간이 없어서 제대로 마무리 짓지 못했던 문제다. 문제 의도는 bfs였다고 한다.
dp를 활용해 최댓값을 구하는 문제였다. dp를 활용해 풀긴 했으나, 이것도 시간이 부족해 완벽하게 제출하진 못했다.
4시간 동안 카페에서 빡 집중해서 푸느라 시간은 금방 갔지만 끝나고 진이 다 빠졌다 ㅠㅠ
처음 도전한 코딩 테스트에서 1차 대회 합격이라는 좋은 결과를 얻어서 너무나도 기뻤다!
코딩 테스트 준비를 제대로 시작한 건 1월이었고, 그동안 실력이 늘고 있는지 잘 느끼지 못했는데 이번 기회를 통해 성장하고 있다는 것을 조금이나마 체감할 수 있었던 것 같다.