티스토리 뷰

#include <stdio.h>
#include <stdlib.h>
int main() {
	int n,i,j,k,p=0,q,e=0;
	scanf("%d",&n);
	char*a[n],*b[n],*c[n],x[51],y[51];
	int d[n];
	for(i=0;i<n;i++){
		scanf("%s %s",x,y);
		if(y[0]!=45){
			q=0;
			for(j=0;j<p;j++){
				k=0;while(a[j][k]==y[k]){if(!y[k++]){q=1;break;}}
				if(q){
					if(d[j]==1){k=-1;while(c[j][k]=x[++k]);}
					d[j]+=1;
	                if(d[j]==2)++e;else if(d[j]==3)--e; 
					break;
				}
			}
			if(!q){
			a[p]=(char*)malloc(51);b[p]=(char*)malloc(51);c[p]=(char*)malloc(51);
			k=-1;while(a[p][k]=y[++k]);
			k=-1;while(b[p][k]=x[++k]);
			d[p++]=1;
			}	
		}
	}
	printf("%d\n",e);
	for(i=0;i<p;i++){if(d[i]==2)printf("%s %s\n",b[i],c[i]);}
}

 

풀이 : map (key - value, value)

 

<변수설명>

p : map 에 있는 key 의 개수입니다. 0부터 시작합니다.

q : map에 있던 key와 같이 같을 경우 1 그렇지 않으면 0 입니다.

e : key개에 정확히 두 개의 value를 가지고 있는 것들의 개수입니다.

n : 입력받는 key - value 쌍의 개수입니다.

i,j,k : 반복문에서 사용할 index 입니다.

 

x,y : key-value를 문자열 쌍으로 받을 때 사용하는 문자 배열입니다.

a,b,c : 각각 key, value1, value2 을 저장할 char* 형 배열입니다. 포인터로 만든 이유는, 메모리의 낭비를 막기위해 새로운 key가 들어올때마다 동적할당을 해주기 위함입니다.

 

d : int형 배열입니다. 특정 key를 가지는 key-value 쌍이 몇번 입력되었는지를 나타냅니다. 이것을 이용하여 3개 이상 들어 온것은 마지막에 출력을 하지 않게 할 수 있습니다.

 

1. n을 입력받습니다. 변수들도 준비를 합니다.

2. n번 key-value 쌍들을 입력받고 처리합니다.

2.1 입력받은 값이 "-" 가 아닐때!

2.2.1 먼저 이미 있던 key 값인지를 확인합니다.

2.2.2 이미 있던 것이라면 관련된 d값을 증가시켜주고 d=2 이면 value2에 대입과 e값 증가, d=3 이면 e값 감소

2.3 아직 map에 없는 key 라면 동적할당을하여 공간을 가져온 다음, 새로운 key, value1 값에 입력받은것을 대입하고 d값을 1로 해줍니다. 그런다음 p값을 1 증가시켜줍니다.

3. key-value1,value2 를 만족하는 것의 개수를 출력합니다 이것은 e값입니다.

4. map 에 key들을 하나씩 살펴보면서 d=2 인 것의 value1, value2을 출력합니다.

 

 

주의사항

 

malloc 한 다음 free을 해야 합니다!! (동적할당해제)

 

'-'은 ascii code로 45번입니다.

 

궁금할 수 도 있는거

k=-1;while(a[p][k]=y[++k]); //y 문자열을 a[p] 문자열에 대입하는 것입니다.

 

while 문의 조건에 대입연산이 들어가는 경우 rvalue 값이 0이면 false, 그외는 true로 인식합니다.

(lvalue = rvalue,  lvalue 는 왼쪽값, rvalue는 오른쪽 값)

c언어는 문자열의 마지막을 '\0' 으로 가지고 있으며 이 Null 문자는 ascii code 값으로 0

즉 while은 '\0'을 대입하면 False로 인식하게 됩니다. 고로 위와 같은 코드도 작동하게 됩니다.

 

 또한 -1부터 시작하는 이유는 k값을 변경하고 (+1) 대입을 하는 순서이기 때문에 이렇게 해야 0번부터 대입이 가능해집니다.
(전위연산자가 lvalue에 있던 rvalue에 있던 먼저 전위연산자를 처리하고 대입을 합니다 고로 a[p][k]=y[++k], a[p][++k]=y[k] 둘다 같습니다,  물론 a[p][++k]=y[++k] 이건 side effect가 발생하므로 해서는 안됩니다)

 

 

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

 

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