IT's 우

[java, 삽입 정렬]백준 11004번: K번째 수, 삽입 정렬 과정 본문

알고리즘/백준

[java, 삽입 정렬]백준 11004번: K번째 수, 삽입 정렬 과정

디우 2022. 9. 6. 23:13
728x90

출처:

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

 

11004번: K번째 수

수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

 

삽입 정렬 과정

1. 현재 index에 있는 데이터 값을 선택한다.
2. 현재 선택한 데이터가 정렬된 데이터 범위에 삽이될 위치를 탐색한다.
3. 삽입 위치부터 index에 있는 위치까지 shift 연산을 수행한다.
4. 삽입 위치에 현재 선택한 데이터를 삽입하고 index++ 연산을 수행한다.
5. 전체 데이터의 크기만큼 index가 커질 때까지, 즉 선택할 데이터가 없을 때까지 반복한다.

 

소스코드
package javaCodingTest;
import java.util.*;
public class j11399 {
	static int[] P;
	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		int N=sc.nextInt();		// 사람의 수
		P=new int[N];		// 돈을 인출하는데 걸리는 시간 입력
		int TimeSum=0;			// 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟
		
		for(int i=0;i<N;i++) {	//돈을 인출하는데 걸리는 시간 P[N] 입력
			P[i]=sc.nextInt();
		}
		
		for(int i=1; i<N;i++) {
			int now=P[i];
			if(P[i-1]<=now)continue;
			for(int j=0; j<i; j++) {
				if(P[j]>now) {	//	i-1~0까지 비교해서 값 넣어주기
					Shift(j,i);	//	j부터 현재 비교한 index i까지 한칸씩 오른쪽으로 이동
					P[j]=now;
					break;
				}
			}
		}
		
		for(int i=0;i<N;i++) {
			TimeSum+=P[i]*(N-i);
		}
		System.out.println(TimeSum);
	}
	
	static void Shift(int index, int now) {//	j부터 현재 비교한 index i까지 한칸씩 오른쪽으로 이동
		for(int i=now; i>index ; i--) {
			P[i]=P[i-1];
		}
		return;
	}
}

->  합부분 야매여서 밑에 소스코드에 합부분 보시오

 

정답 소스코드
package javaCodingTest;

import java.util.*;

public class j11399_2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt(); // N명
		int[] A = new int[N]; // 자릿수별로 구분해 저장한 배열
		int[] S = new int[N]; // A 합 배열: 각 사람이 인출을 완료하는 데 필요한 시간 저장
		
		for(int i=0; i<N; i++) {// 자릿수별로 구분해 저장한 배열
			A[i]=sc.nextInt();
		}
		
		for(int i=1; i<N;i++) {
			int insert_point = i;
			int insert_value = A[i];
			
			for(int j= i-1;j>=0 ; j--) {
				if(A[j]<A[i]) {
					insert_point=j+1;
					break;
				}
				if(j==0) {
					insert_point=0;
				}
					
			}
			
			for(int j=i; j >insert_point;j--) {
				A[j]=A[j-1];
			}
			A[insert_point]=insert_value;
		}
		S[0]=A[0];	 	//	합 배열 만들
		for(int i=1; i<N; i++) {
			S[i]=S[i-1]+A[i];
		}
		int sum=0;	 // 합 배열 총합 구하기
		for(int i=0; i<N;i++) {
			sum+=S[i];
		}
		System.out.println(sum);
	}
}

 

 

 

 

풀이

728x90
반응형