알고리즘/문제풀이

의석이의 우뚝 선 산

lipnus 2018. 9. 14. 17:22
반응형

4796. 의석이의 우뚝 선 산



처음 짠 코드

-정상(local maxima)를 찾고, 양쪽으로 내리막을 찾음

package com.company;

import java.util.Scanner;

public class Main {


public static void main(String[] args) {
// write your code here

Scanner sc = new Scanner(System.in);
int T = sc.nextInt();


for (int i=1; i<=T; i++){

//입력값 받기
int count = sc.nextInt();
int[] arr = new int[count+1];
for(int j=1; j<=count; j++ ){
arr[j] = sc.nextInt();
}//for(j)


//갯수 체크하기
int mountain=0;
for(int j=1; j<=count-2; j++){

int front=0;
int rear=0;
if(arr[j] < arr[j+1] && arr[j+1] > arr[j+2]) {

//정상 앞쪽체크
for(int k=j+1; k>=2; k--){
if(arr[k-1] < arr[k] )front++;
else break;
}

//정상 뒤쪽체크
for(int k=j+1; k<=count-1; k++){
if(arr[k] > arr[k+1] ) rear++;
else break;
}

mountain += front * rear;

}//if
}//for(j)

System.out.println("#" + i + " " + mountain );
}//for(i)

}//main
}





두번 째 짠 코드

-증가하는 구간의 개수와 감소하는 개수를 센 뒤, 내려가다 올라가는 부분(구하고자 하는 구간이 끝난 곳)에서 증가구간*감소구간 개수를 더해줌.

-정상찍고 내려가다 걍 끝나버리는 경우는 따로 체크

import java.util.Scanner;

public class Main {


public static void main(String[] args) {
// write your code here

Scanner sc = new Scanner(System.in);
int T = sc.nextInt();


for (int i=1; i<=T; i++){

//입력값 받기
int count = sc.nextInt();
int[] arr = new int[count+1];
for(int j=1; j<=count; j++ ){
arr[j] = sc.nextInt();
}//for(j)


//갯수 체크하기
int mountain=0;
int front=0;
int rear=0;
for(int j=1; j<=count-1; j++){

//내려가다 다시 올라가는 경우
if(j>1 && arr[j-1]>arr[j] && arr[j]<arr[j+1]){
mountain += front * rear;
front=0;
rear=0;
}

//정상찍고 내려가다 끝난 경우
if(front>0 && j==count-1 && arr[j]>arr[j+1]){
mountain += front * (rear+1);
}

if(arr[j]<arr[j+1]) front++; //증가구간 카운트
if(arr[j]>arr[j+1]) rear++; //감소구간 카운트
}//for(j)

System.out.println("#" + i + " " + mountain );
}//for(i)

}//main
}


반응형

'알고리즘 > 문제풀이' 카테고리의 다른 글

[Hash] 베스트앨범  (0) 2018.09.18
[Hash] 완주하지 못한 선수  (0) 2018.09.17
쇠막대기 자르기  (0) 2018.09.10
[BFS] 미로탐색  (0) 2018.09.10
진수의 홀수 약수  (0) 2018.09.10