-
반응형
https://www.acmicpc.net/problem/2631
2631번: 줄세우기
KOI 어린이집에는 N명의 아이들이 있다. 오늘은 소풍을 가는 날이다. 선생님은 1번부터 N번까지 번호가 적혀있는 번호표를 아이들의 가슴에 붙여주었다. 선생님은 아이들을 효과적으로 보호하기
www.acmicpc.net
풀이
최소한의 어린이만 움직여야 한다는 조건을 보고, 움직이지않아도 되는 아이들의 최댓값을 구한뒤, N값에서 빼면 되겠다 라는 생각을 했다.
이를 위해 이미 자기의 위치에 있는 아이들의 명수를 구하기위해 Lower_bound를 이용하여 가장긴 증가하는 배열의 길이를 구해준 뒤, N값에서 빼주었다. 이 방법으로 자신의 위치에 고정을 해도 되는 아이들을 제외한 나머지 아이들이 각자 자신의 자리를 찾아가면 되기때문이다.
시간복잡도
가장 긴 증가하는 배열의 길이를 구하기위해 Lower_bound를 구현하여 사용했다. Lower_bound함수는 O(logN)시간이 걸리므로, N명에 대해 Lower_bound함수를 적용해주면 O(NlogN)시간이 걸리게된다.
코드
import java.util.Scanner; import java.util.Vector; public class Main { public static int lower_bound(Vector<Integer> arr,int number){ int i,middle,left,right; left=0; right=arr.size()-1; while(left<=right){ middle=(left+right)>>1; if(arr.get(middle)>number){ right=middle-1; } else if(arr.get(middle)<number){ left=middle+1; } } return left; } public static void main(String[] args){ Scanner sc=new Scanner(System.in); int n=sc.nextInt(); Vector<Integer> line = new Vector<>(); for(int i=0;i<n;i++){ int num=sc.nextInt(); if(line.isEmpty()){ line.add(num); } else{ int index=lower_bound(line,num); if(line.size()<=index) line.add(num); else line.set(index,num); } } System.out.println(n-line.size()); } }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 5567번 결혼식 (0) 2021.12.26 [백준OJ] 11497번 통나무 건너뛰기 (0) 2021.12.24 [백준OJ] 7347번 플립과 시프트 (0) 2021.12.24 [백준OJ] 1365번 꼬인 전깃줄 (0) 2021.11.07 [백준OJ] 1309번 동물원 (0) 2021.11.07 댓글