티스토리 뷰
#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
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 27964번 콰트로치즈피자 (백준) (0) | 2025.03.01 |
---|---|
c언어 20291번 파일정리 (백준) (0) | 2025.02.28 |
c언어 2910번 빈도 정렬 (백준) (0) | 2025.02.25 |
c언어 2358번 평행선 (백준) (0) | 2025.02.07 |
c언어 31245번 모바일 광고 입찰 (백준) (0) | 2025.02.03 |
- Total
- Today
- Yesterday
- 누적 합
- 세그먼트 트리
- Segment Tree
- Lazy Propagation
- 그리디
- 그래프
- XOR
- PASCAL
- 브루트포스
- Krustal
- 스택
- 덱
- find
- DP
- 최대공약수
- 누적합
- java
- 1835
- 1835번
- 오프라인 쿼리
- 최소 스패닝 트리
- union
- 플로이드
- C++
- 기하학
- BFS
- 백준
- C언어
- 정렬
- DFS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |