대회 정보와 문제 리스트: https://www.acmicpc.net/contest/view/241
A. 와이버스 부릉부릉
풀이
모두 기분좋게 한 문제씩은 풀고 가라는 의미에서 출제한 문제이다.
시작할 때 한 번 웃고 시작하라고 냈는데 대회장에서 웃는 사람이 아무도 없어서 당황스러웠다 (…)
입력을 받지 않고 문제의 답만 출력해도 되다.
코드
main(){puts("비와이");}
B. 욱제는 결정장애야!!
풀이
데스크립션이 어려웠는지 생각보다 정답률이 낮아서 당황스러웠다 (…)
바구니에 똑같은 공이 없으면 공을 바구니에 넣고, 아니면 바구니에 있는 공과 뽑은 공을 버린다.
각 메뉴는 정확히 2번 뽑을 수 있기 때문에 모든 공을 뽑고 나면 바구니는 비어있게 된다.
공을 끝까지 뽑았을 때, 어떤 시점에 바구니에 들어있는 최대 공의 개수를 구하면 된다.
공이 바구니에 들었는지 여부를 체크하는 check 배열을 만들고,
공을 번호대로 순회하면서 최댓값을 갱신하며 풀면 된다.
코드
#include <stdio.h>
inline int max(int a, int b) { return a > b ? a : b; }
int n, k, cnt, ans;
bool chk[100001];
int main() {
scanf("%d", &n);
for (int i = 0; i < 2 * n; i++) {
scanf("%d", &k);
chk[k] ? --cnt : ++cnt;
chk[k] ^= 1;
ans = max(ans, cnt);
}
printf("%d", ans);
return 0;
}
C. 준오는 조류혐오야!!
풀이
n*m 격자의 배열이 주어졌을 때, 9가 가장 많이 들어있는 행 또는 열을 삭제하고
남아있는 9의 개수를 세어주면 된다.
단순 구현 문제이므로, 구현 방법은 여러 가지가 있을 수 있다.
코드
#include <stdio.h>
#include <algorithm>
using namespace std;
int sm, mx, a[555][555];
inline int f(int k) {
int ret = 0;
while (k) {
if (k % 10 == 9) ret++;
k /= 10;
}
return ret;
}
int main() {
int n, m, i, j;
for (i = 0; i < n; i++) for (j = 0; j < m; j++)
scanf("%d", &a[i][j]);
for (i = 0; i < n; i++) {
int tmp = 0;
for (j = 0; j < m; j++) tmp += f(a[i][j]);
sm += tmp, mx = max(mx, tmp);
}
for (i = 0; i < m; i++) {
int tmp = 0;
for (j = 0; j < n; j++) tmp += f(a[j][i]);
mx = max(mx, tmp);
}
printf("%d", sm - mx);
return 0;
}
D. 쿼리 맛보기
풀이
E번을 제외하고 가장 고배점이었는데 제일 많이 풀어서 또 당황스러웠다 (…)
수열이 주어지고, 쿼리가 주어진다.
1번 쿼리는 [a, b] 구간의 합을 구한 뒤 a번지와 b번지를 스왑한다.
2번 쿼리는 [a, b] 구간의 합에서 [c, d] 구간의 합을 뺀다.
데스크립션에 나와있는 그대로 구현하면 된다.
코드
#include <stdio.h>
#include <algorithm>
int n, q, arr[1001];
int main() {
scanf("%d %d", &n, &q);
for (int i = 0; i < n; i++) scanf("%d", &arr[i]);
while (q--) {
int a, b, c, d, qry, s1 = 0, s2 = 0;
scanf("%d", &qry);
if (qry == 1) {
scanf("%d %d", &a, &b); --a, --b;
for (int i = a; i <= b; i++) s1 += arr[i];
printf("%d\n", s1);
std::swap(arr[a], arr[b]);
}
else {
scanf("%d %d %d %d", &a, &b, &c, &d); --a, --b, --c, --d;
for (int i = a; i <= b; i++) s1 += arr[i];
for (int i = c; i <= d; i++) s2 += arr[i];
printf("%d\n", s1 - s2);
}
}
return 0;
}
E. 문홍안
풀이
어떤 정치적인 성향도 반영되지 않았음을 밝힙니다!
다양한 솔루션이 있을 수 있다.
출제자의 공식 솔루션은 다음과 같다.
비서가 동시에 여러명이 움직였을 때의 결과와 한 명씩 따로따로 움직였을 때의 결과는 같다.
동시에 밟든 따로 밟든 결국 각각의 돌이 밟히는 횟수는 같기 때문이다.
돌의 개수가 100개밖에 되지 않으므로 각 비서의 위치를 pos, 방향을 l 또는 r이라고 할 때
case l: [1, pos-1]
case r: [pos+1, r]
(비서가 서있는 위치는 색이 바뀌지 않으므로 pos-1, pos+1 해준다)
각 구간들을 밟는 시뮬레이션을 돌리며 cnt[] 배열에 밟은 횟수를 카운팅 해준다.
밟는 횟수에 3을 나눈 나머지가 0회일 때 파랑, 1회일 때 빨강, 2회일 때 초록이므로
각각 재산을 비례배분하여 재산 / 100 * cnt[0,1,2]
를 소숫점 둘째 자리까지 출력해주면 된다.
코드
#include <stdio.h>
int p, n, a[101], cnt[3];
int main() {
scanf("%d %d", &p, &n);
while (n--) {
int pos, l = 1, r = 100;
char dir;
scanf("%d %c", &pos, &dir);
dir == 'L' ? r = pos - 1 : l = pos + 1;
for (int i = l; i <= r; i++) a[i]++;
}
for (int i = 1; i <= 100; i++) cnt[a[i] % 3]++;
for (int i = 0; i < 3; i++) printf("%.2lf\n", p * 0.01 * cnt[i]);
return 0;
}
아무말
백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge, wookje, 욱제, 풀이, 선린, 선린인터넷고등학교, sunrin, 문제 풀이, 제1회 천하제일 코딩대회, 준오, 임준오, junoim, 비와이, 힙합, junoim, 임준오, 준오