728x90
[문제]
N개의 정수로 이루어진 수열을 입력받아 서로 인접해 있는 두 수의 차가 1에서 N-1까지의 값을 모두 갖게 되는 수열을 Jolly Jumper라고 한다.
입력받은 수열이 Jolly Jumper가 맞는지 아닌지를 출력해주는 프로그램이다.
[입력 예제]
5
1 4 2 3 7
[출력 예제]
YES
5개의 숫자 [1, 4, 2, 3, 7]을 입력받았다.
각각 인접한 숫자의 차는 [3, 2, 1, 4]로 1부터 4까지의 숫자를 모두 갖게 되어 Jolly Jumper의 조건에 맞았다.
그렇기에 YES를 출력하였다.
[코드]
#include <iostream>
#include <algorithm> //abs()
using namespace std;
int main(int argc, const char * argv[]) {
int n, pre, now, minus;
/*1*/cin >> n;
/*2*/int res[n];
/*3*/for(int i=0; i<n; i++) res[i]=0;
/*4*/cin >> pre;
/*5*/for(int i=1; i<n; i++){
/*6*/cin >> now;
/*7*/minus = abs(pre-now);
/*8*/if(minus>0 && res[minus]!=1 && minus<n) res[minus] = 1;
/*9*/else {
cout << "NO";
return 0;
}
/*10*/pre = now;
}
/*11*/cout << "YES";
return 0;
}
[설명]
- 몇 개의 숫자를 입력받을 건지 입력받는다. (n)
- 인접한 숫자의 차가 들어갈 배열을 선언한다. (res[n])
-
for문을 통해 res배열의 값을 0으로 초기화시킨다.
※ 쓰레기 값 없애기 << 초기화를 해주지 않았더니 결과가 달라졌었다... - 가장 첫 숫자를 입력받는다. (pre)
- for문을 통해 다음 숫자를 입력받으며 숫자의 차가 Jolly Jumper의 조건에 해당하는지 검사한다.
- 다음 숫자를 입력받는다. (now)
- 앞의 숫자(pre)와 입력받은 숫자(now)의 차를 구한다
이때, 음수가 나올 수 있으니 abs함수를 통해 절댓값을 구해 minus에 대입한다. - 만약 minus값이 0보다 크고, res배열의 minus위치가 1이 아니며 minus값이 n보다 작으면 res[minus]에 1을 대입한다.
- 그렇지 않다면 NO를 출력하고 프로그램을 종료한다.
(minus가 0이거나, 인접한 숫자의 차이가 같은 구간이 있었거나, n값을 넘어 버린 경우에는 Jolly Jumper의 조건에 해당하지 않기 때문) - 다음 숫자를 입력받아 전 숫자와 비교를 해야 하니 pre변수에 현재 입력받은 숫자(now)를 넣어준다.
- for문이 끝나고 나면 Jolly Jumper의 조건을 만족한 것이기에 YES를 출력한다.
[실행결과]
728x90
반응형
'문제풀이 > C++' 카테고리의 다른 글
[C++] 마라톤 (0) | 2021.01.16 |
---|---|
[C++] 석차 구하기 (0) | 2021.01.15 |
[C++] 연속 부분 증가수열 (0) | 2021.01.10 |
[C++] 온도의 최대값 (0) | 2021.01.10 |
[C++] 카드게임 (0) | 2021.01.08 |