(scofe) 2021 - 1차 후기

스코페 2021 공지 https://www.wanted.co.kr/events/scofe2021


내 생애 첫 코딩 테스트(?)였던 스코페 2021 후기를 이제서야 기록해보려 한다.

  • 일시: 2021년 3월 20일 (토) 14시~18시
  • 제한 시간: 4시간
  • 문제 수: 6문제

문제 1 - 대여 시간을 추천해드립니다

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);
        }
    }
}

중복되는 구간이 있는지 확인하는 단순 구현 문제였다.

문제 2 - 배송 전략 실험

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 문제였다.

문제 3 - 상품 배치 추천

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번은 풀긴 했지만 맞았는지 확실하지 않아서 코드는 올리지 않겠다.

문제 4 - 안 본 컨텐츠 없게 해주세요

데이터를 알맞은 자료구조로 정의하고 정렬하는 것이 문제였다. 이 문제를 풀다가 헷갈리는 바람에 시간이 다 가버려서 자료구조 다루는 실력이 아직 부족하다고 느껴졌다.

문제 5 - 시선이동

dfs로 풀긴 했는데 시간이 없어서 제대로 마무리 짓지 못했던 문제다. 문제 의도는 bfs였다고 한다.

문제 6 - 팝업스토어

dp를 활용해 최댓값을 구하는 문제였다. dp를 활용해 풀긴 했으나, 이것도 시간이 부족해 완벽하게 제출하진 못했다.

후기

4시간 동안 카페에서 빡 집중해서 푸느라 시간은 금방 갔지만 끝나고 진이 다 빠졌다 ㅠㅠ
처음 도전한 코딩 테스트에서 1차 대회 합격이라는 좋은 결과를 얻어서 너무나도 기뻤다!

코딩 테스트 준비를 제대로 시작한 건 1월이었고, 그동안 실력이 늘고 있는지 잘 느끼지 못했는데 이번 기회를 통해 성장하고 있다는 것을 조금이나마 체감할 수 있었던 것 같다.

좋은 웹페이지 즐겨찾기