본문 바로가기
X/인알그 스터디

6일차

by 유시은 2020. 9. 15.

2020-09-07
초급 : 17273 카드 공장 (Small) (Bronze II)

www.acmicpc.net/problem/17273

 

17273번: 카드 공장 (Small)

진서는 CTP 카드 공장의 노동자이다. 공장에는 N개의 카드가 있으며 각 카드에는 앞면과 뒷면에 숫자가 쓰여있다. 공장장 노진의 명령에 따라서 진서는 카드를 뒤집어야 한다. 명령은 M번 내려지�

www.acmicpc.net

from sys import stdin
input = stdin.readline

n, m = input().split()
n = 1
f = True

front, back = map(int, input().split())

for i in range(int(m)):
    k = int(input())
    if f:
        if front <= k:
            f = not f
    else:
        if back <= k:
            f = not f

if f: print(front)
else: print(back)

 

문제에서 주어진대로 구현하면 된다.

 

 

중급 : 1213 팰린드롬 만들기 (Silver IV)

www.acmicpc.net/problem/1213

 

1213번: 팰린드롬 만들기

첫째 줄에 문제의 정답을 출력한다. 만약 불가능할 때는 "I'm Sorry Hansoo"를 출력한다. 정답이 여러 개일 경우에는 사전순으로 앞서는 것을 출력한다.

www.acmicpc.net

from sys import stdin
def input(): return stdin.readline().rstrip()

s = input()
alphabet = [0]*26
for c in s:
    alphabet[ord(c) - ord("A")] += 1

oddCnt = 0
for a in alphabet:
    if a%2 == 1: oddCnt += 1

if oddCnt > 1:
    print("I'm Sorry Hansoo")
else:
    r = ""
    for i, a in enumerate(alphabet):
        for _ in range(a//2): r+=chr(i+65)
    if oddCnt == 1:
        for i, a in enumerate(alphabet):
            if a%2 == 1: r+=chr(i+65)
    for i in range(25, -1, -1):
        for _ in range(alphabet[i]//2): r+=chr(i+65)
    print(r)

 

모든 알파벳이 짝수개 있다면 반씩 나누어서 출력하면 된다. (aaaabbcc > aabccbaa)

 

한 알파벳이 홀수개 있는 것이 허용된다.

 

이 때 역시 모든 알파벳을 반씩 나누어서 출력하면 (정확히는 //2 만큼) 되는데, 정가운데에 홀수개 있는 알파벳을 하나 더해서 출력하면 된다.

 

처음엔 AAABB 같은 입력에서 BAAAB 를 출력해서 틀렸었다.

 

 

고급 : 배틀로얄 (Gold V)

www.acmicpc.net/problem/19639

 

19639번: 배틀로얄

첫 번째 줄에 X, Y, M (0 ≤ X, Y ≤ 100,000, 2 ≤ M ≤ 100,000)이 주어진다. M은 짝수다. 다음 X개의 줄에는 i번째 사람과 싸웠을 때 잃게 되는 체력이 주어진다. 이 수는 0 이상 M / 2 이하의 정수이다.

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;

int X, Y, M, m;
deque<pii> foe;
deque<pii> item;
vector<int> res;

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	cin >> X >> Y >> M;
	m = M;

	for (int x = 0; x < X; ++x) {
		int input; cin >> input;
		foe.push_back({ input, x + 1 });
	} sort(foe.begin(), foe.end());
	for (int y = 0; y < Y; ++y) {
		int input; cin >> input;
		item.push_back({ input, y + 1 });
	} sort(item.begin(), item.end());

	while (!foe.empty() || !item.empty()) {
		bool gfe = !foe.empty(), gie = !item.empty();
		while (!foe.empty() && m > foe.back().first ) {
			res.push_back(-1 * foe.back().second);
			gfe = true;
			m -= foe.back().first; foe.pop_back();
		}
		while (!item.empty() && (foe.empty() || m <= foe.back().first)) {
			res.push_back(item.front().second);
			gie = true;
			m += item.front().first; item.pop_front();
			m = min(m, M);
		}
		if (!gfe || !gie) break;
	}

	if (res.size() == X + Y) {
		for (int r : res) cout << r << "\n";
	}
	else cout << 0;
	

	return 0;
}

 

문제에 "적과 싸웠을 때 잃게 되는 체력은 / 2 이하고 체력 회복 아이템 역시 밸런스를 위해 최대 / 2 만큼 회복할 수 있다." 라는 조건이 있으므로 강한 적부터 싸우다가 죽을 것 같으면 비효율적인 회복약부터 먹는 전략이 통한다.

 

그대로 구현한 다음 어떤 게임이었는지 판정하면 된다.

 

적이 남았다면 회복약을 아무리 잘 먹어도 적에게 맞아 죽는다는 뜻이다.

'X > 인알그 스터디' 카테고리의 다른 글

5일차  (0) 2020.09.15
4일차  (0) 2020.09.15
3일차  (0) 2020.09.15
2일차  (0) 2020.09.05
1일차  (0) 2020.09.05

댓글