본문 바로가기
4_ 고소한 알고리즘

C- ACM - 양말 짝 맞추기

by 준환이형님_ 2010. 7. 2.

양말 짝을 맞추는 문제입니다. 저는 젓가락 행진곡 처럼 양 끝에서 가운데로 한짝씩 맞춰나가는 문제라고 이해하고 풀었어요~/ 

양말 장사를 하는 지훈이는 오랜만에 창고 정리를 하기로 했다. 창고에는 양말짝이 맞지 않은 채 가득 섞여 있었다. 이제 지훈이를 도와 어지럽게 섞여있는 양말의 짝을 맞추어 보자.
- 양말의 종류는 알파벳으로 구분된다.
- 양말의 오른짝은 소문자, 왼짝은 대문자이다.
  즉, Jj가 J 양말의 한 쌍이며, aB는 a양말의 오른짝과 B양말의 왼짝이므로 짝이 맞지 않는다. 
입력의 첫 번째 줄은 테스트 케이스의 개수 T ( 0 < T <= 30)가 주어지며, 각 테스트 케이스는 한 줄에 하나씩 창고에 있는 양말이 종류와 짝에 상관없이 연속으로 입력된다. 최대 입력되는 양말의 개수는 100개이며, 테스트 케이스에는 알파벳 대소문자만이 입력된다.  하나의 테스트 케이스마다 한 줄씩 출력하며, 주어진 양말의 모든 짝이 맞는다면 ‘YES’를 출력하며, 양말의 짝이 맞지 않는 경우는 ‘NO’를 출력한다. 

aaAA ->YES
CAdBb ->NO
Bab ->NO

#include <stdio.h>
#include <math.h>
int CASE()
{
 int tail=30; 
 char sox[30];
 gets(sox);
 while(sox[tail--]);              // 끝에서부터 NULL값을 찾음
 if(tail%2==0){return 0;}    // 양말 홀수개의 입력이면 리턴 0을 반환함
 for(int i=0; i[tail; i++)
 {  
  if(abs(sox[i]-sox[tail])==32){tail--; continue;}  // 짝이 일치할때 회문을 도는 형식
  else return 0;                                                 // 한번이라도 일치하지 않으면 리턴 0을 반환함
 }
 return 1;
}
int main(void)
{
 int repeat;
 scanf("%d",&repeat);
 fflush(stdin);              // 스캔에서의 엔터값 버퍼를 비움
 for(int i=1; i[=repeat; i++)
 {
  if(CASE())printf("Case #%d:\nYES\n",i);
  else{printf("Case #%d:\nNo\n",i);}
 }
 return 0;
}  

'4_ 고소한 알고리즘' 카테고리의 다른 글

C- ACM - 휴대폰번호 정렬  (0) 2010.07.13
C- ACM - 대지  (0) 2010.07.07
C- ACM - 다운로드  (0) 2010.07.02
C- ACM - 지뢰찾기  (4) 2010.06.23
C- ACM - 수 뒤집기  (0) 2010.06.12