Programming

[CF] Round #606 Div. 2_220107

minigb 2022. 1. 10. 03:49

https://codeforces.com/contest/1277

 

Dashboard - Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4) - Codeforces

 

codeforces.com

학회 코포 스터디에서 금요일마다 도는 버추얼로 참여했다.

 

오늘 제출한 코드는 전반적으로 조금 덜 깔끔하다.

진짜 PS용 코드다...ㅎ 무지성 구현 !

그치만 오늘은 뭔가 이걸 다듬고 싶지 않기도 하고

이런 식으로 현장감 있는 코드도 기록으로 남겨두고 싶어서

제출했던 코드를 그대로 올리려고 한다.

 

A.

1부터 9까지 11...1, 22...2 이런 식의 수를 만들어서 개수를 그냥 다 세면 된다.

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int tc; cin >> tc;
	while (tc--) {
		int ans = 0;
		ll n; cin >> n;
		for (ll i = 1; i <= 9; ++i) {
			for (ll cur = i; cur <= n; cur = cur * 10 + i) {
				++ans;
			}
		}
		cout << ans << kEndl;

	}
}

 

 

B.

이미 홀수인 건 확인할 필요가 없으므로 짝수만 고려한다.

그리고 나누는 operation을 최소로 진행하기 위해서는 중복되는 수를 최대한 많이 만들어내야 하므로 큰 수부터 작업하면 된다.

또 나누는 과정을 한 번 할 때 같은 수들도 모두 나뉘기 때문에 중복되는 수 중 하나만 고려하면 된다.

그래서 set 자료구조를 이용해서 큰 수부터 2로 나누고, 만약 나눈 결과가 짝수이면 다시 set에 삽입하는 풀이를 떠올렸다.

 

이때 set의 정렬 기준을 내림차순으로 하려고 했는데, 어떻게 설정하는 건지 순간 기억이 안 나서 그냥 set을 만든 다음에 end iterator를 이용해서 최댓값을 찾은 후 그걸 삭제했다.

(스터디에서 풀이할 때 다트님 코드를 보니 rbegin() 메소드로 가장 마지막 iterator를 불러오셨다. 새로운 걸 배웠다.)

그리고 이걸 2로 나눈 결과가 짝수면 또 set에 넣어줘야 하는데, 나는 그냥 현재 수가 4의 배수인지를 확인하는 걸로 구현했다.

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int tc; cin >> tc;
	while (tc--) {
		int n; cin >> n;
		set<int> arr;
		int ans = 0;
		for (int i = 0; i < n; ++i) {
			int number; cin >> number;
			if (number % 2 == 0) {
				arr.insert(number);
			}
		}
		while (!arr.empty()) {
			auto iter = arr.end();
			--iter;
			int cur = *iter;
			arr.erase(cur);
			if (cur % 4 == 0) {
				arr.insert(cur / 2);
			}

			++ans;
		}
		cout << ans << kEndl;
	}
}

set으로 숫자를 처리하는 부분에서 이것보다 조금 더 깔끔하게 구현할 수 있을 거 같다.

그치만 이건 PS니까...ㅎ

일단 맞기 위해서 이렇게 짰다.

 

 

C.

코드포스를 할 때 항상 염두에 두는 게, 코드포스에서 제공하는 풀이를 온전히 받아들일 필요는 없다는 건데,

오늘은 그러다가 한 번 틀렸다.

 

일단 twone이 있는지 확인해야 한다. 만약에 있으면 twone에서 o를 빼줘야 하고, twone이 아닌 one이나 two가 있다면 이 중에서 아무거나 빼주면 된다,

고 생각했지만 그렇지 않았다. 예를 들어서 oooooneee와 같은 경우도 있을 수 있기 때문에 무조건 가운데의 n과 w를 제거해야 한다.

 

그런데 처음에 코드를 깔끔하게 만들 생각만 하면서 모든 케이스에서 (시작 인덱스 + 2)를 답으로 구하는 바람에 한 번 틀렸다.

근데 애초에 예제에서 (시작 인덱스 + 1)를 답으로 하는 걸 보여주고 있는데 말이야. 괜히 이걸 무시했다가 틀렸다ㅜ

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int tc; cin >> tc;
	vector<string> strvec = { "twone", "two", "one" };
	while (tc--) {
		string s; cin >> s;
		vector<int> ans;
		for (int i = 0; i < s.length(); ++i) {
			for(const string comp : strvec) {
				bool okay = true;
				if (i + comp.length() - 1 < s.length()) {
					for (int j = 0; j < comp.length(); ++j) {
						if (s[i + j] != comp[j]) {
							okay = false;
							break;
						}
					}
				}
				else {
					okay = false;
				}

				if (okay) {
					if (comp == "twone") {
						ans.push_back(i + 2 + 1);
					}
					else {
						ans.push_back(i + 1 + 1);
					}

					i += comp.length() - 1;
					break;
				}
			}
		}

		cout << ans.size() << kEndl;
		for (const int index : ans) {
			cout << index << ' ';
		}
		cout << kEndl;
	}
}