Experiences

[출제] 2023 청정수컵 (이민희진, 김밥천국의 계단) - Sogang ICPC Team

minigb 2023. 5. 28. 03:51

5월 20일에 개최된 2023 청정수컵에서 각 Round에 한 문제씩 냈다.

새내기 Round
- 23학번 학회원이라면 누구나! 참가 자격 제한 없이 모두 참여 가능

청정수 Round
아래의 제한 조건에 해당하지 않는 모든 학회원
- Codeforces 1600 이상
- Atcoder 1200 이상
- Solved.ac Platinum Ⅲ 이상
- ICPC, UCPC, SUAPC, Camp Contest, SCPC, SPC, 청정수컵 등의 프로그래밍 대회 수상자

 

 

이민희진 (BOJ 28064)

https://www.acmicpc.net/problem/28064

 

28064번: 이민희진

첫 줄에 연결할 수 있는 서로 다른 사람 쌍의 개수를 출력한다.

www.acmicpc.net

새내기 Round D번이다.

문제 세팅해주신 yunny_world님께 다시 한번 감사드립니다.

 

이전에 친구들이랑 이야기한 것에서 영감을 얻었다. 코딩을 처음 배운 분들에게 적당히 복잡한 구현 문제가 되길 기대했다.

 

결과적으로 ‘적당’하진 않았는데

이것보다 E를 더 많이 푸셨다.

코드 짜보니까 복잡하긴 하더라!

 

bool is_connectable(const string& a, const string& b, bool is_swapped) {
    int max_step = min(a.length(), b.length());
    for (int cnt = 1; cnt <= max_step; ++cnt) {
        bool same = true;
        for (int i = 0; i < cnt; ++i) {
            if (a[a.length() - cnt + i] != b[i]) {
                same = false;
                break;
            }
        }
        if (same) {
            return true;
        }
    }

    if (is_swapped) {
        return false;
    }
    else {
        return is_connectable(b, a, true);
    }
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
    int n; cin>> n;
    vector<string> arr(n);
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
    }

    int count = 0;
    for (int i = 0; i < n; ++i) {
        for (int j = i + 1; j < n; ++j) {
            count += is_connectable(arr[i], arr[j], false);
        }
    }

    cout << count << kEndl;
}

 

대회 끝나고 얼핏 듣기로는 파이썬으로 문자열 슬라이싱해서 비교하는 방법이 생각났는데 구현을 못 떠올려서 못 푼 분들도 있으신 거 같았다.

 

 

김밥천국의 계단 (BOJ 28069)

https://www.acmicpc.net/problem/28069

 

28069번: 김밥천국의 계단

첫 번째 줄에 계단 개수에 해당하는 $N$, 계단을 오르는 횟수 $K$가 주어진다. $(1 \leq N, K \leq 1\,000\,000)$

www.acmicpc.net

새내기 Round C번이다.

문제 세팅해주신 tkfkddl59323님께 다시 한번 감사드립니다.

 

이전부터 ‘미니김밥’을 살린 문제를 꼭 만들고 싶었고 마침 아이디어가 번뜩 떠올랐다.

 

0번째 계단에서 지팡이를 계속 두드리면 횟수를 차감할 수 있다는 것만 떠올리면 DP로 적당히 풀만한 문제가 될 거 같았다.

결과적으로 ‘적당’하진 않았는데

전반적으로 시도 횟수가 많고 대회 중에 이것보다 D를 먼저 푸는 분이 많았다. 여기서 말리신 거 같기도 하다.

원래는 B였는데 dong_gas의 검수 덕분에 C로 바뀐 게 정말 다행이다.

 

int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
    int n, k; cin >> n >> k;

	vector<int> count(n + 1, n);
	count[1] = 1;
	for (int i = 1; i <= n; ++i) {
		if (i + 1 <= n) {
			count[i + 1] = min(count[i + 1], count[i] + 1);
		}
		if (i + i / 2 <= n) {
			count[i + i / 2] = min(count[i + i / 2], count[i] + 1);
		}
	}
	cout << ((count[n] <= k) ? "minigimbob" : "water") << kEndl;
}

 

BOJ에 내가 만든 문제를 하나쯤 올리고 싶었는데 정말 하게 돼서 아주 신난다.

덕분에 이번엔 출제위원 이름표도 적었다 ㅎㅎ

 

도움 주신 두 분께 다시 한번 감사드립니다!

 

 

 

 

 

 

https://blog.naver.com/mini_gb/223113610268

 

[출제] 2023 청정수컵 (이민희진, 김밥천국의 계단) - Sogang ICPC Team

5월 20일에 개최된 2023 청정수컵에서 각 Round에 한 문제씩 냈다. 새내기 Round - 23학번 학회원이라면 ...

blog.naver.com