삽입 정렬은 이미 정렬된 데이터 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입시켜 정렬하는 방식이다. 시간 복잡도는 O(n^2) 핵심 선택 데이터를 현재 정렬된 데이터 범위 내에서 적절한 위치에 삽입하는 것이 삽입 정렬의 핵심이다. 삽입 정렬의 수행 방식 1. 현재 index에 있는 데이터 값을 선택한다. 2. 현재 선택한 데이터가 정렬된 데이터 범위에 삽입될 위치를 탐색한다. 3. 삽입 위치부터 index에 있는 위치까지 shift 연산을 수행한다. 4. 삽입 위치에 현재 선택한 데이터를 삽입하고 index++ 연산을 수행한다. 5. 전체 데이터의 크기만큼 index가 커질 때까지, 즉 선택할 데이터가 없을 때까지 반복한다. 추가적으로 이진탐색을 사용하면 시간 복잡도를 줄일 수 있다.
분류 전체보기
선택 정렬은 대상 데이터에서 최대나 최소 데이터를 데이터가 나열된 순으로 찾아가며 선택하는 방법. 시간 복잡도 O(n^2)으로 느린 편 핵심 최솟값 or 최댓값 찾고, 남은 정렬 부분의 가장 앞에 있는 데이터와 swap 하는 것 선택 정렬 과정 1. 남은 정렬 부분에서 최솟값 또는 최댓값을 찾는다. 2. 남은 정렬 부분에서 가장 앞에 있는 데이터와 선택된 데이터를 swap한다. 3. 가장 앞에 있는 데이터의 위치를 변경해(index++) 남은 부분의 범위를 축소한다. 4. 전체 데이터 크기만큼 index가 커질 때까지, 즉 남은 정렬 부분이 없을 때까지 반복한다. 시간복잡도가 O(n^2)인 이유를 생각해보자. 데이터의 개수가 n개 일때, 첫 번째 루프에서 비교횟수는 1~ n-1번으로 n-1번 두 번째 루..
https://www.acmicpc.net/problem/2675 2675번: 문자열 반복 문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다 www.acmicpc.net import sys input=sys.stdin.readline n=int(input()) for i in range(n): a,b=input().split() a=int(a) b=str(b) for i in range(len(b)): print(a*b[i],end= '') print()
버블 정렬은 두 인접한 데이터의 크기를 비교해 정렬하는 방식이다. 시간복잡도: O(n^2)으로 느린 편 루프를 돌면서 인접한 데이터 간의 swap 연산으로 정렬한다. 버블 정렬 과정 1. 비교 연산이 필요한 루프 범위를 설정한다. 2. 인접한 데이터 값을 비교한다. 3. swap 조건에 부합하면 swap 연산을 수행한다. 4. 루프 범위가 끝날 때까지 2~3을 반복한다. 5. 정렬 영역을 설정한다. 다음 루프를 실행할 때는 이 영역을 제외한다. 6. 비교 대상이 없을 때까지 1~5를 반복한다. 만약 특정 루프 전체 영역에서 swap이 한번도 발생하지 않았다면 그 영역 뒤에 있는 데이터는 정렬이 완료된 것이므로 프로세스 종료
https://www.acmicpc.net/problem/2839 2839번: 설탕 배달 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그 www.acmicpc.net import sys input=sys.stdin.readline sugar=int(input()) bag=0 while sugar>=0 : if sugar%5 ==0: bag+= (sugar//5) print(bag) break sugar -=3 bag += 1 else: print(-1) 까다로웠다. 제일 중요한 키포인트는 루프를 돌 동안 5로는 나머지를 비교하고, 3으로는 빼는 것을 생각하는 것이다.
https://www.acmicpc.net/problem/15917 15917번: 노솔브 방지문제야!! 어떤 수 a가 2의 거듭제곱꼴로 나타내어진다고 해 봅시다. 그렇다면, a = 2n (단 n ≥ 0인 정수) 를 만족할 겁니다. 보통, 각 비트별로 검사를 하면서, 켜져 있는 비트의 개수를 알아내는 것도 좋은 www.acmicpc.net import sys input=sys.stdin.readline q=int(input()) a=[2**i for i in range(32)] for i in range(q): b=int(input()) if b in a: print('1') else: print('0') 지금까지 푼 문제 중 가장 까다로웠다. 처음에는 제곱근을 생각했으나, a의 범위가 1~2의 31승-1..
https://www.acmicpc.net/problem/11006 11006번: 남욱이의 닭장 계란집을 운영하는 남욱이는 매일 닭장에서 달걀을 수거해간다. 어느 날 닭장에 들어가보니 일부 닭의 다리가 하나씩 사라졌다. 남욱이는 얼마나 많은 닭들이 한 다리를 잃었는지 알고싶었 www.acmicpc.net import sys input=sys.stdin.readline n=int(input()) for i in range(n): a,b=map(int,input().split()) u=b*2-a print(u, b-u)
https://www.acmicpc.net/problem/10886 10886번: 0 = not cute / 1 = cute 준희는 자기가 팀에서 귀여움을 담당하고 있다고 생각한다. 하지만 연수가 볼 때 그 의견은 뭔가 좀 잘못된 것 같았다. 그렇기에 설문조사를 하여 준희가 귀여운지 아닌지 알아보기로 했다. www.acmicpc.net import sys input=sys.stdin.readline chan,ban=0,0 n=int(input()) for i in range(n): a=int(input()) if a==1: chan+=1 else: ban+=1 if chan>ban: print("Junhee is cute!") else: print("Junhee is not cute!")