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

C- ACM - 휴대폰번호 정렬

by 준환이형님_ 2010. 7. 13.
엑셀을 만들라는 문제..드뎌 온갖 야매란 야매는 다 써서 풀었답니다~ ㅋㅋㅋ
D. 휴대폰번호 정렬
(Time Limit: 2 seconds)
LK 텔레콤에 근무하는 신입사원 정희에게 부장님이 새로운 업무를 지시했다. 고객들의 휴대폰 전화번호를 정렬하는 작업이다.
휴대폰 번호는 국번 3 자리와 중간국번 3자리 또는 4자리, 그리고 뒷 자리 수 4 자리로 총 10 개 혹은 11 개의 숫자로 이루어진다.
그리고 휴대폰 국번은 010, 011, 016, 017, 018, 019 의 여섯 가지가 존재한다. 국번과 중간국번, 뒷자리 수는 하이픈(“-”)으로 구분된다. 부장님이 원하는 요구사항은 다음과 같다. 우선, 특정 국번 번호 순서로 정렬이 되어야 하며, 국번이 같은 경우에는 중간국번 숫자끼리 비교해서 오름차순 정렬이 되어야 하며, 중간국번도 같은 경우에는 뒷자리 번호를 비교해서 오름차순으로 정렬이 되야 한다. 단, 부장님이 원하는 정렬순서는 국번이 같을 경우 중간국번 4 자리인 휴대폰 번호가 중간국번 3 자리인 휴대폰 번호보다 항상 정렬 우선순위가 높다. 즉, 국번이 같은 경우 중간국번 4 자리인 휴대폰 번호가 중간국번 3자리인 휴대폰 번호보다 정렬 시 항상 먼저 등장한다. 예를 들어, 다음과 같은 휴대폰 번호를 정렬한다고 하자.

011-275-3587
017-1111-2600
019-222-2222
017-111-1234
018-275-9562
010-333-1111
016-1235-3333
이 번호들을 017 / 011 / 018 / 019 / 010 / 016 국번 순으로, 그리고 중간국번 4 자리가 중간국번 3자리보다 우선순위가 높도록 정렬을 한다면, 아래와 같이 정렬이 될 것이다.
017-1111-2600
017-111-1234
011-275-3587
018-275-9562
019-222-2222
010-333-1111
016-1235-3333
위의 결과에서 첫 번째 라인의 017-1111-2600 과 두 번째 라인의 017-111-1234 를 비교해보면, 중간국번 111 은 1111 보다 작으므로 일반적으로는 정렬 시 017-111-2600 이 먼저 등장해야 하나, 부장님의 요구사항에서 중간국번 4 자리가 중간국번 3 자리보다 항상 정렬 우선순위가 높다는 규칙 때문에 017-1111-2600 이 017-111-1234 보다 먼저 등장한 것을 알 수 있다.
Input
첫 줄에는 테스트 케이스의 개수 T ( 0 < T <= 20 ) 가 주어진다.각각의 테스트케이스의 첫 번째 줄에는 정렬할 휴대폰 번호의 개수 N(0 < N <= 50) 이 주어진다.테스트케이스의 두 번째 줄에는 0, 1, 6, 7, 8, 9 의 6개의 숫자가 임의의 순서로 표시된다.이 숫자들은 휴대폰 국번을 의미하며, 6개의 숫자들이 나열되는 순서는 테스트 케이스마다 바뀔수 있다. 당신은 이 순서대로 국번 별 순서로 휴대폰번호를 정렬해야 한다.예를 들어, 숫자 7 1 8 9 0 6 이 표시됐다면 017 / 011 / 018 / 019 / 010 / 016 국번 순으로 정렬해야 한다. 세 번째 줄부터는 라인 당 하나씩의 휴대폰 번호가 N 개 만큼 입력된다. 휴대폰 번호에서 국번은
010, 011, 016, 017, 018, 019 의 여섯 가지만 입력되며, 휴대폰 번호는 0 부터 9 까지의 숫자와 “–“ 로 구성되며, 빈칸을 포함하지 않으며 그 외 다른 문자는 포함되지 않는다. 참고로, 우리나라 휴대폰 번호에서 010 국번의 경우 중간국번은 항상 4 자리지만 이 문제에서는 010 국번도 중간 국번이 3 자리가 될 수 있다고 정의한다. 즉, 모든 휴대폰번호는 국번에 상관없이 중간국번이 세자리 혹은 네 자리가 될 수 있다.
#include 
#include 		// atoi
#include 		// abs

#define SWAP(x,y,t) (t=x), (x=y), (y=t)		//스왑정의

typedef struct phone_num
{
	unsigned int fst_num;	//사업자번호 (010등)
	unsigned int snd_num;	//나머지번호
}num;

int main(void)
{
	num list[50];			//스트럭쳐 50개
	num list_temp;			//스왑에 사용할 스트럭쳐 한개 
	char in_txt[14];		//문자열 배열
	int N, repeat, temp;	//번호갯수, 테스트케이스, 스왑용변수
	int st_num[6];			//사업자번호 끝자리 정렬용

	scanf("%d",&repeat);
	
	for(int z=0; z[repeat; z++)
	{
	scanf("%d",&N);		
	scanf("%d %d %d %d %d %d ",&st_num[0], &st_num[1], &st_num[2], &st_num[3], &st_num[4], &st_num[5]);
	
	for(int i=0; i[N; i++)
	{
		gets(in_txt);

		list[i].fst_num=atoi(in_txt+2);		//사업자번호 끝자리만 숫자로 변경하여 구조체에 넣음 
		list[i].snd_num=atoi(in_txt+4)*10000+abs(atoi(in_txt+8));	// 중간자리를 받아 10000을 곱함 + 끝자리를 받아 중간자리에 더함
	}

	for(int i=0; i[N; i++)	// 삽입정렬
	{
		if(list[i].snd_num>list[i-1].snd_num){temp=list[i].snd_num;}else{continue;}
		
		for(int j=0; j[N; j++)
		{
			if(list[j].snd_num[temp){SWAP(list[i], list[j], list_temp);}
		}
	}
	printf("------------------\n");

	for(int j=0; j[6; j++)	//정렬된 수를 사업자 번호의 순서에 맞게 출력
	{
		for(int i=0; i[N; i++)
		{
			if(st_num[j]==list[i].fst_num){printf("01%d-%d-%d\n", list[i].fst_num, list[i].snd_num/10000, list[i].snd_num%10000);}
		}
	}
	printf("------------------\n");
	}

	return 0;
}
 

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

알고리즘 사이트 모음  (0) 2011.09.19
Algorithm - Counting Sort  (1) 2011.03.30
C- ACM - 대지  (0) 2010.07.07
C- ACM - 양말 짝 맞추기  (0) 2010.07.02
C- ACM - 다운로드  (0) 2010.07.02