[18870] 좌표 압축

RudinP·2023년 4월 7일
0

BaekJoon

목록 보기
26/77

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.
Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다.
X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.

입력

  • 첫째 줄에 N이 주어진다.
    둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.

출력

  • 첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.

제한

  • 1 ≤ N ≤ 1,000,000
  • -10^9 ≤ Xi ≤ 10^9

생각

압축이 뭔소린지 몰라서 입출력 예시를 유심히 봤다.
좌표의 크기 순대로 순위를(?) 쓰라는듯했다.
제한 때문에 계수정렬은 쓰지 못한다.

그래서,
1) (실제값, 기존 입력된 순서) 를 튜플 어레이로 받는다.
2) 실제값을 기준으로 정렬한다.
3) 결과를 저장할 배열을 만든다.
4) 실제값이 몇번째로 큰지 정해주는 정수형변수 사용
5) 반복문에서 3의 배열에 2에서 정렬된 배열 순서대로, 기존 입력된 순서를 인덱스로 하여 해당 인덱스에 4의 정수형변수를 넣어준다. 이 정수형변수는 만약 기존 수가 정렬된 배열에서 이전 수와 같지 않다면 증가시키지 않는다.(같은 수는 동일한 번째가 되도록)

코드

namespace SongE
{
    public class Program
    {
        static void Main(string[] args)
        {
            StreamWriter sw = new(new BufferedStream(Console.OpenStandardOutput()));

            int n = int.Parse(Console.ReadLine());
            string[] s = Console.ReadLine().Split();
            (int num, int oldIndex)[] vertex = new (int, int)[n];
            
            for(int i = 0; i < n; i++){
                vertex[i] = (int.Parse(s[i]), i);
            }

            //num 기준 오름차순
            Array.Sort(vertex);

            int[] result = new int[n];
            int newIndex = 0;

            for(int i = 1; i < n; i++){
                if(vertex[i-1].num != vertex[i].num)
                    newIndex++;
                
                result[vertex[i].oldIndex] = newIndex;
            }
            sw.Write(string.Join((' '), result));
            sw.Close();
            

        }
    }

}

참고

profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

0개의 댓글