25번 문제
내가 풀이한 답
문제도 짧고 흔할 것 같이 생긴 문제였다. 당장 생각나는 것은 입력받은 값들을 순회(for)를 돌면서 그 순회 속에 순회(for)를 돌아서 전것들과 비교하면서 하는 것이였다. 하지만, 요즘 Time Limit을 신경쓰고 있어서 그런지 이중 순회(for)를 안쓰려고 했다.
그래서 생각해낸 방법은 입력 받은 수들을 배열(a)에 저장하고 그 값들을 또 새로운 배열(b)에 저장한다. 배열 a를 다시 sort 함수를 이용해 오름차순으로 정렬하고 다음 값과 같지 않으면 전체 인원 - 인덱스를 빼준다. 이러면, 다음 값이 같은 값이여도 등수문제를 해결할 수 있다.
이중 순회(for)를 안써서 시간상으로는 조금 더 빠르겠지만 메모리를 많이 잡아먹는 다는 단점과 라이브러리를 많이 사용한다는 단점이 있다.
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
using namespace std;
int c[101];
int main(int argc, char** argv) {
//freopen("input.txt", "rt", stdin);
int n, i;
scanf("%d", &n);
int *a = (int *)malloc(sizeof(int) * (n+1));
int *b = (int *)malloc(sizeof(int) * (n+1));
for(i=0; i<n; i++){
scanf("%d", &a[i]);
}
memcpy(b, a, sizeof(int)*(n+1));
sort(a, a+n);
for(i=0; i<n; i++){
if(a[i] != a[i+1]){
c[a[i]] = n-i;
}
}
for(i=0; i<n; i++){
printf("%d ", c[b[i]]);
}
free(a);
free(b);
return 0;
}
결과는 통과하였다.
사이트의 답안
#include<stdio.h>
int main(){
//freopen("input.txt", "rt", stdin);
int i, j, a[200], b[200], n;
scanf("%d", &n);
for(i=1; i<=n; i++){
scanf("%d", &a[i]);
b[i]=1;
}
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
if(a[j]>a[i]) b[i]++;
}
}
for(i=1; i<=n; i++){
printf("%d ", b[i]);
}
return 0;
}
사이트의 답은 맨 처음 생각했던 방식이 나왔다. 입력 값의 범위가 크지 않으므로 이중 순회(for)를 돌아도 문제가 없었다.
'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글
27. N!의 표현법 (0) | 2020.09.08 |
---|---|
26. 마라톤 (0) | 2020.09.08 |
24. Jolly Jumpers (0) | 2020.09.08 |
23. 연속 부분 증가수열 (0) | 2020.09.08 |
22. 온도의 최대값 (0) | 2020.09.07 |