백준 웹사이트 "2565번 - 전깃줄" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)

문제
2565번: 전깃줄
첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는
www.acmicpc.net
소스 코드
#include <stdio.h> void sort(int * A, int * B, int num); int max(int a, int b); int main(void){ int num; scanf("%d", &num); int A[num]; int B[num]; for(int i=0; i<num; i++){ scanf("%d %d", &A[i], &B[i]); } // 1. A 전봇대와 연결된 위치 오름차순 정렬 sort(A, B, num); /* for(int i=0; i<num; i++){ printf("%d %d\n", A[i], B[i]); }*/ // 2. B 전봇대와 연결된 위치 LIS 계산 int LIS[num]; //LIS[i]: B[i]를 포함하는 가장 긴 부분 수열의 길이 LIS[0]=1; for(int i=1; i<num; i++){ LIS[i]=1; for(int j=0; j<i; j++){ if(B[i]>B[j]){ LIS[i] = max(LIS[i], LIS[j]+1); } } } int max=0; for(int i=0; i<num; i++){ if(LIS[i]>max) max=LIS[i]; } // 3. 없애야 하는 전깃줄 개수 출력 printf("%d\n", num-max); } void sort(int * A, int * B, int num){ for(int i=0; i<num-1; i++){ int min_index = i; for(int j=i+1; j<num; j++){ if(A[j]<A[min_index]){ min_index = j; } if(j==num-1){ //swap both A and B int temp_A = A[min_index]; A[min_index] = A[i]; A[i] = temp_A; int temp_B = B[min_index]; B[min_index] = B[i]; B[i] = temp_B; } } } } int max(int a, int b){ if(a>b) return a; else return b; }
문제 풀이
반응형
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 1912번 - 연속합 (0) | 2022.03.16 |
---|---|
[백준/C언어] 9251번 - LCS (0) | 2022.03.15 |
[백준/C언어] 11054번 - 가장 긴 바이토닉 부분 수열 (0) | 2022.03.13 |
[백준/C언어] 11053번 - 가장 긴 증가하는 부분 수열 (0) | 2022.03.12 |
[백준/C언어] 2156번 - 포도주 시식 (0) | 2022.03.11 |