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 |