Pascal/BAEKJOON
pascal 27334번 マラソン大会 (Marathon Race) (백준)
rofn123
2025. 7. 16. 15:56
var n,i:word;a,d:array[0..999]of word;
begin
read(n);
for i:=0 to 999 do d[i]:=0;
for i:=1 to n do begin read(a[i]);d[a[i]]+=1;end;
for i:=1 to 999 do d[i]+=d[i-1];
for i:=1 to n do writeln(1+d[a[i]-1]);
end.
먼저 들어온대로 순서를 매기는 문제입니다.
단 동시에 들어온 경우 (ex 1등 2명, 2등 1명)
2등은 존재하지 않으며 3등이 됩니다.
풀이
1. 배열 a는 입력받은 수를 순서대로 저장, 배열 d는 1~1000 수가 얼마나 입력됬는지를 저장
2. d[i] += d[i-1] 을 반복합니다 (누적합), 이것을 해야 자신 앞에 얼마나 많이 있는지 확인이 가능합니다.
ex) 1 1 1 2 3 3 3, 2의 입장에서 자신보다 앞에 있는 사람이 d[2-1] = 3 이므로 자신은 4등입니다. 마찬가지로 3의 입장에서 자신보다 앞에 있는 사람이 d[3-1] = 4 이므로 자신은 5등입니다.
3. 입력받은 수 순서대로 d[a[i]-1]+1 을 출력합니다.