1. 문제

www.acmicpc.net/problem/20127

 

20127번: Y-수열

N개의 정수로 이루어진 수열 a1, ... , aN이 있다. 택희는 해당 수열이 증가수열 혹은 감소수열이 되게 만들고 싶다. 증가수열은 모든 i(1 ≤ i < N)에 대해서 ai ≤ ai+1을 만족하는 수열이고, 감소수열

www.acmicpc.net

2. 접근방법

맨 앞 몇 개의 K개의 숫자를 맨뒤로 보냈을 때

증가 or 감소 수열로 만들 수 있는지 묻는 문제

 

문제를 잘못 읽고 맨 앞이 아니라

중간의 숫자도 골라서 뒤로 보낼 수 있는 줄 알고 고생 좀 했다..

 

나 올 수 있는 모양이

증가 수열 ( 3, 4, 5 ) + 증가 수열 ( 1, 2 )

이면 345를 뒤로 보내 증가수열로 만들 수 있다.

즉 수열이 나뉘는 곳 앞의 갯수를 세면 된다.

 

그런데

(3, 4, 5) (1,2) (1,2)

이런 모양이면 불가능하다

수열 변곡이 두번 일어나선 안된다.

 

(3,4,5) (1,4)

이 모양도 불가능 하다.

3 4 5 를 뒤로 보내도 1 4 3 4 5 가 되어

증가수열이 될 수 없음.

 

즉 앞 증가수열의 첫번째 수와 뒤 증가수열의 마지막 수가 증가수열 형태면

변경된 증가수열도 증가수열이 되게 된다.

 

수열 변곡이 한번도 없었다면 ans 1이 된다.

 

마이너스 수열도 마찬가지로 생각하고 주의해서 풀이하면 된다.

 

 

3. 자바 코드

package Silver;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class P20127Y수열1 {
	static boolean pline, mline;
	static boolean pcant, mcant;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine());
		int cnt1 = 1;
		int cnt2 = 1;
		int firstnum = Integer.parseInt(st.nextToken());
		int lastnumP = firstnum;
		int lastnumM = firstnum;
		for (int i = 1; i < N; i++) {
			int num = Integer.parseInt(st.nextToken());
			if (!pline) {
				if (lastnumP <= num) {
					lastnumP = num;
					cnt1++;
				}
				else {
					pline = true;
					lastnumP = num;
				}
			} else if(!pcant) {
				if (lastnumP <= num)
					lastnumP = num;
				else
					pcant = true;
			}
			if (!mline) {
				if (lastnumM >= num) {
					lastnumM = num;
					cnt2++;
				}
				else {
					mline = true;
					lastnumM = num;
				}
			} else if(!mcant) {
				if (lastnumM >= num)
					lastnumM = num;
				else
					mcant = true;
			}
		}
		int ans = 100000000;
		if (!pline || !mline) {
			ans = 0;
		} else {
			if (firstnum < lastnumP)
				pcant = true;
			if (firstnum > lastnumM)
				mcant = true;
		}
		if(!pcant)
			ans = Math.min(ans, cnt1);
		if(!mcant)
			ans = Math.min(ans, cnt2);
		if(pcant && mcant)
			ans = -1;
		System.out.println(ans);
	}

}

4. 마치며

처음 문제를 잘못 봐서 삽질하는 시간이 너무 오래걸렸다.

문제를 잘 읽자ㅜ

 

 

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

[백준] 15661 링크와 스타트  (3) 2021.01.24
[백준] 16988 Baaaaaaaaaduk2  (2) 2021.01.21
[백준] 2151 거울설치  (0) 2021.01.17
[백준] 17140 이차원 배열과 연산  (0) 2021.01.16
[백준] 5014 스타트링크  (0) 2021.01.13

+ Recent posts