estherseo
JINIWAY
estherseo
전체 방문자
오늘
어제
  • 분류 전체보기
    • 전공공부
    • CS
      • Network
      • Algorithm
      • 📖
      • python
      • django
    • Pentest
      • 📖
      • HTB
      • Machines
    • Web-hacking
      • 📖
      • Dreamhack
      • Portswigger
    • System-hacking
      • 📖
    • Mobile-hacking
    • Project
    • CVE
    • CTF
    • News & Conference
    • 자격증
    • 신기술
      • AI

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 블로그 소개

인기 글

최근 댓글

최근 글

태그

  • 네트워크관리사 실기 합격
  • CTF공부
  • ASC스터디
  • 다크웹 모니터링 서비스
  • CVE-2022-22817
  • jwt token last character
  • 화이트햇투게더
  • 2022 네트워크관리사
  • 시스템해킹 스터디
  • n00bCTF
  • ASC 스터디
  • 셸쇼크
  • 시스템해킹공부
  • 2022 pox
  • 세계신안보포럼
  • integer overflow
  • 다크웹 모니터링
  • HTB valentine
  • 패킷잡기
  • HTB shocker
  • shocker
  • 화이트햇투게더1기 결과공유회
  • 중소기업 정보보호
  • pox2022
  • python eval
  • 스택카나리
  • Pillow취약점
  • 기사요약
  • asc
  • 화이트햇투게더1기
hELLO · Designed By 정상우.
estherseo

JINIWAY

CS/Algorithm

[Algorithm] 이코테 : 두 배열의 원소 교체

2024. 6. 30. 23:10

 

시간복잡도를 잘못 계산했나?

왜 계수 정렬이 더 좋아보이지..

 

"""
문제: 배열A의 모든 원소의 합이 최대가 되도록 하라.
최대 K번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A의 모든 원소의 합의 최댓값
(1<=N<=100000, 1<=K<=N)

1. 아이디어 
(1) 계수 정렬
- A, B 오름차순 정렬
(2) python 내장 함수 sort
- A : 오름차순 정렬
- B : 내림차순 정렬

- k번 for문 돌면서, A가 B보다 작을 때 A의 가장 작은 원소 <-> B의 가장 큰 원소

2. 시간복잡도
(1) 계수 정렬
- A, B 정렬 : O(N+R)=10만+10만=20만 << 2초
- 원소 바꿔치기 : O(K)=10만
(2) python 내장 함수 sort
- A, B 정렬 : O(NlogN)=10만xlog10만=200만 << 2초
- 원소 바꿔치기 : O(K)=10만

3. 자료구조
A, B : int[][]

"""
""" input
5 3
1 2 5 4 3
5 5 6 6 5
"""
import sys
input = sys.stdin.readline

N, K = map(int, input().split())
arrayA = list(map(int, input().split()))
arrayB = list(map(int, input().split()))

# 1. 계수정렬
def countingSort(array):
    count = [0]*(max(array)+1)
    result = []
    for i in array:
        count[i] += 1
    for i in range(len(count)):
        for j in range(count[i]):
            result.append(i)
    return result

for i in range(K):
    # A < B 일때만 교체
    if arrayA[i] < arrayB[N-i-1]:
        arrayA[i], arrayB[N-i-1] = arrayB[N-i-1], arrayA[i]

arrayA = countingSort(arrayA)
arrayB = countingSort(arrayB)


# 2. python 내장 함수 sort
arrayA.sort()
arrayB.sort(reverse=True)

for i in range(K):
    # A < B 일때만 교체
    if arrayA[i] < arrayB[i]:
        arrayA[i], arrayB[i] = arrayB[i], arrayA[i]
    else:
        break

print(sum(arrayA))

 

 

참고 - https://www.youtube.com/watch?v=KGyK-pNvWos&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=4

'CS > Algorithm' 카테고리의 다른 글

[Algorithm][벨만포드] 백준 11657 : 타임머신  (0) 2024.07.03
[Algorithm][다익스트라]  (0) 2024.07.02
[Algorithm] 선택정렬, 삽입정렬, 계수정렬  (0) 2024.06.30
[Algorithm][이진탐색] 백준 1920 : 수찾기  (0) 2024.06.29
[Algorithm][dfs, bfs] 백준 1260 : dfs와 bfs  (0) 2024.06.28
    'CS/Algorithm' 카테고리의 다른 글
    • [Algorithm][벨만포드] 백준 11657 : 타임머신
    • [Algorithm][다익스트라]
    • [Algorithm] 선택정렬, 삽입정렬, 계수정렬
    • [Algorithm][이진탐색] 백준 1920 : 수찾기
    estherseo
    estherseo
    안녕하세요😀

    티스토리툴바