[2024 동계모각코] 6주차 결과

2025. 2. 16. 22:08·스터디/2024동계모각코

"Do it! 알고리즘 코딩테스트 with Python" 책에서

04-2 선택 정렬, 04-3 삽입 정렬 부분을 풀어볼 것입니다.


04-2 선택 정렬

선택 정렬(selection sort)은 대상 데이터에서 최대나 최소 데이터를 데이터가 나열된 순으로 찾아가며 선택하는 방법입니다. 선택 정렬은 구현 방법이 복잡하고, 시간 복잡도도 O(n^2)으로 효율적이지 않아 코딩 테스트에서는 많이 사용하지 않는다고 합니다. 선택 정렬 원리만 간단히 알아보고 넘어가겠습니다.

 

선택 정렬의 핵심 이론

최솟값 또는 최댓값을 찾고, 남은 정렬 부분의 가장 앞에 있는 데이터와 swap하는 것이 선택정렬의 핵심입니다.

 

선택 정렬 과정

1. 남은 정렬 부분에서 최솟값 또는 최댓값을 찾는다.

2. 남은 정렬 부분에서 가장 앞에 있는 데이터와 선택된 데이터를 swap한다.

3. 가장 앞에 있는 데이터의 위치를 변경해(index++) 남은 정렬 부분의 범위를 축소한다.

4. 전체 데이터 크기만큼 index가 커질 때까지, 즉 남은 정렬 부분이 없을 때까지 반복한다.


문제 17 내림차순으로 자릿수 정렬하기

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


1단계 문제 분석하기

자연수를 받아 자리수별로 정렬하는 문제이므로 먼저 숫자를 각 자릿수별로 나누는 작업이 필요합니다.

파이썬에서는 input데이터를 list로 변환하면 자동으로 각 자릿수로 나누어 리스트화해주기 때문에 변경이 매우 간편합니다. list 변환을 사용해 봅시다!

그 다음에는 단순하게 배열을 정렬하면 됩니다. 파이썬 sort()함수를 사용해도 되지만, N의 길이가 크지 않으므로 앞에서 배운 선택 정렬을 사용해 내림차순 정렬을 수행해 보겠습니다.

 


02단계 손으로 풀어보기

1. list변환을 사용하여 편리하게 input 데이터를 리스트에 저장합니다.

2. 리스트의 데이터를 선택 정렬 알고리즘을 이용해 내림차순 정렬합니다. 내림차순 정렬이므로 최댓값을 찾아 기준이 되는 자리와 swap합니다.

 


03단계 슈도코드 작성하기

A(자릿수별로 구분해 저장한 리스트)
A 리스트 저장

for i를 A 리스트만큼 반복:
	for j를 i+1 ~ A 리스트 길이만큼 반복:
    	현재 범위에서 Max값 찾기
    현재 i의 값과 Max값 중 Max값이 더 크면 swap수행
    
A 리스트 출력

04단계 코드 구현하기

# 내림차순으로 자릿수 정렬하기(선택정렬렬)

import sys
print=sys.stdout.write

A=list(input())

for i in range(len(A)):
    Max=i
    for j in range(i+1,len(A)):
        if A[Max]<A[j]:
            Max=j
    A[i],A[Max]=A[Max],A[i]

for i in range(len(A)):
    print(A[i])

04-3 삽입 정렬

 

삽입 정렬(insertion sort)은 이미 정렬된 데이터 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입시켜 정렬하는 방식입니다. 시간 복잡도는 O(n^2)으로 느린 편이지만 구현하기가 쉽습니다.

 

삽입 정렬의 핵심 이론:

선택 데이터를 현재 정렬된 데이터 범위 내에서 적절한 위치에 삽입하는 것이 삽입 정렬의 핵심입니다.

 

삽입 정렬 과정

1. 현재 index에 있는 데이터 값을 선택한다.

2. 현재 선택한 데이터가 정렬된 데이터 범위에 삽입될 위치를 탐색한다.

3. 삽입 위치부터 index에 있는 위치까지 shift 연산을 수행한다.

4. 삽입 위치에 현재 선택한 데이터를 삽입하고 index++ 연산을 수행한다.

5. 전체 데이터의 크기만큼 index가 커질 떄까지, 즉 선택할 데이터가 없을 때까지 반복한다.

 

적절한 삽입 위치를 탐색하는 부분에서 이진 탐색(binary search) 등과 같은 탐색 알고리즘을 사용하면 시간 복잡도를 줄일 수 있습니다!

 


문제 018 ATM 인출 시간 계산하기

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


01단계 문제 분석하기

 

ATM에서 모든 사람이 가장 빠른 시간에 인출하는 방법을 그리디 방식으로 해결해 봅시다.

ATM 앞에 있는 사람 중 인출 시간이 가장 적게 걸리는 사람이 먼저 인출할 수 있도록 순서를 정하는 것이 곧 그리디 방식입니다. 그리고 이를 위해서는 인출 시간을 기준으로 값을 정렬해야 합니다. N의 최댓값이 1,000이고, 시간 제한이 1초이므로 시간 복잡도가 O(n^2)이하인 정렬 알고리즘 중 아무거나 사용해도 됩니다. 여기서는 삽입 정렬을 이용하겠습니다. 정렬을 마친 후에는 각 사람이 돈을 인출하는 데 필요한 시간을 더하면 됩니다!

 


02단계 손으로 풀어보기

 

1. 삽입 정렬을 이용해 인출 시간 Pi를 기준으로 데이터를 오름차순 정렬합니다.

2. 정렬된 데이터를 바탕으로 모든 사람이 돈을 인출하는 데 필요한 최솟값을 구합니다. 인출에 필요한 시간은 앞사람들의 인출 시간의 합 + 자신의 인출 시간이므로 합 배열로 풉니다.


03단계 슈도코드 작성하기

N(사람 수)
A(자릿수별로 구분해 저장한 리스트)
S(A 합 배열: 각 사람이 인출을 완료하는 데 필요한 시간을 저장)

for i를 1~N만큼 반복:
	for j를 i-1~0까지 뒤에서부터 반복:
    	현재 범위에서 삽입 위치 찾기
    for j를 i~insert_point+1까지 뒤에서부터 반복:
    	삽입을 위해 삽입 위치에서 i까지 데이터를 한 칸씩 뒤로 밀기
    삽입 위치에 현재 데이터 저장
    
for i를 1~N만큼 반복:
	A 리스트를 통한 합 배열 S 만들기
    
S 리스트의 각 데이터값을 모두 합해 결과 출력

04단계

# ATM 인출 시간 계산하기

N=int(input())
A=list(map(int,input().split()))
S=[0]*N

for i in range(1,N): # 삽입 정렬
    insert_point = i
    insert_value = A[i]
    for j in range(i-1, -1, -1):
        if A[j] < A[i]:
            insert_point = j+1
            break
        if j == 0:
            insert_point = 0
    for j in range(i, insert_point, -1):
        A[j] = A[j-1]
    A[insert_point] = insert_value
    
S[0] = A[0]

for i in range(1,N): # 합 배열 만들기
    S[i] = S[i-1]+A[i]

sum=0

for i in range(0,N): # 합 배열 총합 구하기
    sum+=S[i]

print(sum)

'스터디 > 2024동계모각코' 카테고리의 다른 글

[2024 동계모각코] 6주차 목표  (0) 2025.02.16
[2024 동계모각코] 5주차 결과  (0) 2025.02.16
[2024 동계모각코] 5주차 목표  (0) 2025.02.16
[2024 동계모각코] 4주차 결과  (0) 2025.02.07
[2024 동계모각코] 4주차 목표  (0) 2025.02.07
'스터디/2024동계모각코' 카테고리의 다른 글
  • [2024 동계모각코] 6주차 목표
  • [2024 동계모각코] 5주차 결과
  • [2024 동계모각코] 5주차 목표
  • [2024 동계모각코] 4주차 결과
soyun5
soyun5
개발블로그
  • soyun5
    soyun5
    soyun5
  • 전체
    오늘
    어제
    • 분류 전체보기 (67) N
      • 운영체제및실습 (14)
      • 프로그래밍언어개론 (1)
      • 데이터베이스 (0)
      • 클라우드 (0)
        • 2025 AWS Cloud 초급특강 (0)
      • 스터디 (23)
        • 2024하계모각코 (10)
        • 2024동계모각코 (13)
      • 웹개발 (0)
        • HTML, CSS, 자바스크립트 (0)
      • PS (0)
        • 백준 (0)
        • 프로그래머스 (0)
      • 앱개발 (0)
        • flutter (0)
      • C (0)
      • java (0)
        • 자료구조 (0)
        • 알고리즘 (0)
      • 깃허브 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Directory
    운영체제
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
soyun5
[2024 동계모각코] 6주차 결과
상단으로

티스토리툴바