반응형
[ 문제 ]
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.
Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다.
X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.
[ 코드 ]
1. 내 코드
- 입력 배열을 중복제외 정렬하여 인덱스 번호를 저장해 출력
using System.Text;
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
StringBuilder sb = new StringBuilder();
int n = int.Parse(sr.ReadLine());
int[] arr = sr.ReadLine().Split().Select(int.Parse).ToArray();
int[] sortArr = arr.OrderBy(x => x).Distinct().ToArray();
Dictionary<int, int> Count = new Dictionary<int, int>();
for (int i = 0; i < sortArr.Length; i++)
{
Count[sortArr[i]] = i;
}
foreach (var num in arr)
{
sb.Append($"{Count[num]} ");
}
sw.Write(sb.ToString().TrimEnd());
sw.Flush();
sw.Close();
sr.Close();
2. 다른 사람 참고 코드
- 튜플로 이전 인덱스와 값이 다를때 count를 증가시키고 그걸 arr[i].index위치의 result인덱스에 저장 후 출력
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
int n = int.Parse(sr.ReadLine());
string[] input = sr.ReadLine().Split();
(int num, int index)[] arr = new (int, int)[n] ;
for (int i = 0; i < n; i++)
{
arr[i] = (int.Parse(input[i]), i);
}
Array.Sort(arr);
int[] result = new int[n];
int indexCount = 0;
for (int i = 1; i < n; i++)
{
if (arr[i-1].num != arr[i].num)
{
indexCount++;
}
result[arr[i].index] = indexCount;
}
sw.Write(string.Join(" ", result));
sw.Flush();
sw.Close();
sr.Close();
아주 어마무시한 메모리를 구경할 수 있을것...
[ 실행화면 ]
문제링크: https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에
www.acmicpc.net
반응형
'Language > C#' 카테고리의 다른 글
[C#] 백준 14425번 문자열 집합 (0) | 2024.03.23 |
---|---|
[C#] 백준 17103번 골드바흐 파티션 (0) | 2024.03.23 |
[C#] 백준 7568번 덩치 (0) | 2024.03.21 |
[C#] 백준 1966번 프린터 큐 (0) | 2024.03.20 |
[C#] 백준 11866번 요세푸스 문제 0 (0) | 2024.03.20 |