티스토리 뷰

#include <stdio.h>

int main(void) {
	char s;
	int U=0, D=0;
	for(; ~(s = getchar()) ;) {
		if(s == 'U' || s == 'C') U++;
		if(s== 'D' || s== 'P') D++;
	}
	if(U>D/2+(D&1) && D) printf("UDP");
	else if(D) printf("DP");
	else printf("U");
	return 0;
}

 

풀이 : 그리디 알고리즘

 

1. 문자열을 getchar()로 받습니다. 그다음 버퍼에서 하나씩 꺼내서 U (C 또는 U)가  몇개인지, D(D 또는 P)가 몇개인지를 계산합니다.

2. 문제의 입력은 EOF으로 끝나며, getchar에서 EOF는 -1이라는 정수값으로 s에 들어가게 됩니다. 이러한 -1을 not 비트연산을 하면, 0이 됩니다. 즉 false 이므로 반복문은 종료됩니다.

3. U와 C은 같으며, D와 P도 같습니다.

4. 만약 D가 존재하나, U의 개수가 D의 절반의 개수보다 많다면 (홀수 일 경우 D의 절반 = D의 전체/2+1) U가 가장 많이 있을 수도 있으며, U을 전부 C로 보게 된다면 D와 P가 가장 많이 있다고도 볼 수 있으니 UDP 입니다.

5. 만약 4의 조건을 만족하지 못한다면, U의 개수가 가장 많이 있을수가 없게 됩니다. 여기서 D가 존재한다면 D와 P가 가장 많이 있다고 볼 수 있습니다.

6. 만약 5의 조건도 만족하지 못한다면, 이는 D가 0이며, U만 존재한다는 뜻입니다 (문제에서 입력은 1개이상 있다고 나와있기에) 

7. U D P 중 아무것도 결정짓지 못하는 경우는 없기에 (입력은 1개 이상이다) C을 출력할 경우는 없습니다.

 

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

 

27919번: UDPC 파티

첫 번째 줄에 참가자가 투표한 결과 $V$가 주어진다. $V$는 U, D, P, C만 포함하는 문자열이고, 길이는 $0$보다 크고 $100\ 000$을 넘지 않는다.

www.acmicpc.net

 

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함