일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 비트마스크
- 메모리풀
- 조합
- 우선순위 큐
- BeautifulSoup
- MST
- 스택
- 크루스칼
- 빠른 입출력
- 클래스
- 세그먼트 트리
- DP
- Knapsack
- 중복 순열
- 그리디
- 이분 탐색
- 완전 탐색
- 순열
- dfs
- BFS
- lis
- 재귀
- 링크드리스트
- 피보나치 수
- 문자열
- 분할 정복
- SSAFY
- 시뮬레이션
- 백트래킹
- 큐
- Today
- Total
작심 24/7
[백준] 16890번 창업 본문
16890번: 창업
입력은 길이가 N(1 ≤ N ≤ 300,000)인 문자열 두 개로 이루어져 있다. 모든 문자열은 알파벳 소문자로만 이루어져 있다. 첫 번째 줄에 주어지는 문자열은 구사과가 고른 문자이고, 두 번째 줄에 주��
www.acmicpc.net
구사과는 사전 순으로 가장 앞서게 만들고 싶어 하므로
오름차순 정렬한다.
큐브러버는 사전 순으로 가장 뒤에 오게 만들고 싶어 하므로
내림차순 정렬한다.
회사의 이름은 N개의 문자열로 이루어져 있고
고르는 순서는 항상 구사과가 먼저이므로
구사과 문자열에서 (N+1)/2개,
큐브러버 문자열에서 N/2개
를 골라야 한다.
ex)
koooosaga → aagkoooos
cubelover → vuroleecb
1번째 - 구사과 차례
aagko 에서 제일 작은 문자가
vuro 에서 제일 큰 문자보다 작으면
aagko 에서 제일 작은 문자가 최대한 앞으로 가야 한다.
a |
2번째 - 큐브러버 차례
vuro 에서 제일 큰 문자가
agko 에서 제일 작은 문자보다 크면
vuro 에서 제일 큰 문자가 최대한 앞으로 가야 한다.
a | v |
3번째 - 구사과 차례
agko 에서 제일 작은 문자가
uro 에서 제일 큰 문자보다 작으면
agko 에서 제일 작은 문자가 최대한 앞으로 가야 한다.
a | v | a |
4번째 - 큐브러버 차례
uro 에서 제일 큰 문자가
gko 에서 제일 작은 문자보다 크면
uro 에서 제일 큰 문자가 최대한 앞으로 가야 한다.
a | v | a | u |
이런 식으로 표를 끝까지 채우면 이렇게 된다.
a | v | a | u | g | r | k | o |
o |
zzzz → zzzz
aaaa →aaaa
인 경우는 어떨까?
1번째 - 구사과 차례
zz 에서 제일 작은 문자가
aa 에서 제일 큰 문자보다 크거나 같다면
zz 에서 제일 큰 문자가 최대한 뒤로 가야 한다.
z |
2번째 - 큐브러버 차례
aa 에서 제일 큰 문자가
z 에서 제일 작은 문자보다 작거나 같다면
aa 에서 제일 작은 문자가 최대한 뒤로 가야 한다.
a | z |
이런 식으로 표를 채우면 이렇게 된다.
a | z | a | z |
구사과의 입장에서는
작은 문자가 앞으로 갈수록 좋은데
만약 자기가 가지고 있는 제일 작은 문자가
큐브러버가 가지고 있는 제일 큰 문자보다 크거나 같다면
자기가 가지고 있는 제일 큰 문자가 뒤로 갈수록 좋다.
큐브러버 입장에서는
큰 문자가 앞으로 갈수록 좋은데
만약 자기가 가지고 있는 제일 큰 문자가
구사과가 가지고 있는 제일 작은 문자보다 작거나 같다면
자기가 가지고 있는 제일 작은 문자가 뒤로 갈수록 좋다.
이 포인트를 파악하여 구현해주어야 한다.
#include <iostream>
#include <algorithm>
#include <string>
#include <functional>
#include <deque>
using namespace std;
string a, b, front, back;
deque <char> A, B;
int main() {
cin >> a >> b;
sort(a.begin(), a.end());
sort(b.begin(), b.end(), greater<>());
for (int i = 0; i < (int)(a.size() + 1) / 2; i++) A.push_back(a[i]); // 오름차순
for (int i = 0; i < b.size() / 2; i++) B.push_back(b[i]); // 내림차순
for (int i = 0; i < a.size(); i++) {
if (i % 2) { // 큐브러버 차례
if (A.empty() || A.front() < B.front()) front += B.front(), B.pop_front(); // 큐브러버의 제일 큰 애가 구사과의 제일 작은 애보다 크면 앞으로 가는게 좋다
else back += B.back(), B.pop_back();
}
else { // 구사과 차례
if (B.empty() || A.front() < B.front()) front += A.front(), A.pop_front(); // 구사과의 제일 작은 애가 큐브러버의 제일 큰 애보다 작으면 앞으로 가는게 좋다
else back += A.back(), A.pop_back();
}
}
reverse(back.begin(), back.end());
cout << front << back;
return 0;
}
'백준' 카테고리의 다른 글
[백준] 1753번 최단경로 (C++, JAVA) (0) | 2020.09.08 |
---|---|
[백준] 11062번 카드 게임 (0) | 2020.09.04 |
[백준] 1339번 단어 수학 (0) | 2020.08.28 |
[백준] 16500번 문자열 판별 (0) | 2020.08.27 |
[백준] 11652번 카드 (0) | 2020.08.27 |