Notice
Recent Posts
Recent Comments
Link
DY N DY
실력키우기 삽입정렬 횟수 세기(C++) 본문
1814 : 삽입정렬 횟수 세기
제한시간: 1ms 메모리제한: 32MB
해결횟수: 488회 시도횟수: 709회
임의의 서로 같지 않은 수로 이루어진 수열 A를 삽입정렬을 하고자 한다.
만약 배열 A에 20, 40, 30, 10 이 들어갈 경우 다음과 같이 삽입정렬이 이루어진다.
i = 1 일 때 20, 40, 30, 10 이동수 : 0
i = 2 일 때 20, 40, 30, 10 이동수 : 0
i = 3 일 때 20, 30, 40, 10 이동수 : 1 (40이 움직이고 30이 들어감)
i = 4 일 때 10, 20, 30, 40 이동수 : 3 (20, 30, 40 이 움직이고 10이 들어감)
총 4번의 밀어내기를 통하여 삽입정렬이 완료된다.
임의의 수열 A가 주어질 경우, 수열의 숫자가 얼마나 이동하는지 출력하는 프로그램을 작성하시오.
[Copy]4 20 40 30 10 | [Copy]4 |
[Copy]3 -1 1 0 | [Copy]1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /************************************************************** Problem: 1814 User: a132034 Language: C++ Result: Success Time:1 ms Memory:1740 kb ****************************************************************/ #include <iostream> #include <algorithm> using namespace std; int main() { int n; int * arr; int count = 0; cin >> n; arr = new int [n]; for ( int i = 0; i < n; ++i) cin >> arr[i]; for ( int i = 1; i < n; ++i) { for ( int j = 0; j <= i - 1; ++j) { if (arr[i] < arr[j]) { count += i - j; int tmp = arr[i]; for ( int a = i-1; a >= j; --a) { arr[a + 1] = arr[a]; } arr[j] = tmp; break ; } } } cout << count << endl; return 0; } |
삽입정렬을 풀고 바로 풀어서 그런지.. 크게 어렵지 않았다.
숫자가 움직이는 총 횟수를 세는 문제였는데, 결국 i - j들의 합과 동일하기 때문에.
(0번, 1번 인덱스의 교환일 경우 1회, 0번, 2번 인덱스의 교환일 경우 2회 숫자가 움직인다. 결국 i, j 인덱스의 차이와 동일)
출력 대신 i - j를 count변수에 더해 주었다.
삽입정렬에 대한 설명은 이전 포스팅 삽입정렬 과 동일하기 때문에 생략한다.
'PARK > ALGORITHM' 카테고리의 다른 글
실력키우기 최대공약수, 최소공배수(JAVA) (0) | 2016.05.25 |
---|---|
알고리즘 치즈(JAVA) (1) | 2016.05.24 |
실력키우기 삽입정렬(C++) (0) | 2016.05.23 |
실력키우기 카드게임(C++) (0) | 2016.05.22 |
실력키우기 빙고(C++) (0) | 2016.05.21 |