[백준] 34030. So☆Lucky

newbieski·2025년 8월 26일

백준

목록 보기
248/253

https://www.acmicpc.net/problem/34030

문제요약

  • 20만개 수가 주어짐(1~10^9)
  • 연산1 : 연속한 두 수 합이 홀수면 교환 가능
  • 연산2 : 연속한 두 수 합이 짝수면 교환 가능
  • 연산1만 써서 오름차순 정렬이 될까?
  • 연산2만 써서 오름차순 정렬이 될까?

접근법

  • 뭐가 되었든 순서가 바뀐 애들은 서로 교환이 되어야함
    • 예를들어 10 ....... 2 라면 언젠가 (10,2)가 교환이 되어야함
  • 같은숫자가 있으면 굳이 교환하지 않아도 됨
    • 예를들어 ....7 .. 7 ... 2 .... 이면 (7,7)은 교환하지 않아도 됨
  • 어떤 숫자의 오른쪽 부분에서 어떤 숫자보다 작은 숫자들을 대상으로 판단
    • 그 숫자들은 결국 왼쪽으로 옮겨져야하고, 결국 교환을 하기때문에
    • 그 숫자들의 값보다 홀/짝인지가 중요
  • 구간트리로 접근하는 것처럼 보일 수도 있으나 정렬로 해결 가능
  • 숫자가 작고, 좌표가 왼쪽인 숫자부터 판단 시작
  • 그 숫자의 오른쪽에 그 숫자보다 작고 홀/짝이 있는지 판단하면 : 연산1, 연산2 실패 여부를 판단할 수 있음
  • 홀/짝 판단은 어떻게?
    • A[t] : t 위치의 오른쪽에 홀수/짝수가 있다? 없다를 알려주는 배열
  • A 배열을 만드는 방법?
    • 아까 정렬한 결과의 순서대로 숫자를 처리
    • 숫자가 홀/짝이면 숫자의 위치부터 왼쪽을 모두 있음으로 처리
    • 그런데 어짜피 항상 왼쪽 끝까지는 가지 않음
    • 다른 숫자가 홀/짝을 채웠으면 더 채울 필요가 없음
    • 즉 A 배열은 O(N) 시간으로 생성이 됨
profile
newbieski

0개의 댓글