본문 바로가기

문제풀이/C++

[C++] Jolly Jumpers

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;
}

 

[설명]

  1. 몇 개의 숫자를 입력받을 건지 입력받는다. (n)
  2. 인접한 숫자의 차가 들어갈 배열을 선언한다. (res[n])
  3. for문을 통해 res배열의 값을 0으로 초기화시킨다.
    쓰레기 값 없애기 << 초기화를 해주지 않았더니 결과가 달라졌었다...

  4. 가장 첫 숫자를 입력받는다. (pre)
  5. for문을 통해 다음 숫자를 입력받으며 숫자의 차가 Jolly Jumper의 조건에 해당하는지 검사한다.
  6. 다음 숫자를 입력받는다. (now)
  7.  앞의 숫자(pre)와 입력받은 숫자(now)의 차를 구한다
     이때, 음수가 나올 수 있으니 abs함수를 통해 절댓값을 구해 minus에 대입한다. 
  8. 만약 minus값이 0보다 크고, res배열의 minus위치가 1이 아니며 minus값이 n보다 작으면 res[minus]에 1을 대입한다.
  9. 그렇지 않다면 NO를 출력하고 프로그램을 종료한다.
    (minus가 0이거나, 인접한 숫자의 차이가 같은 구간이 있었거나, n값을 넘어 버린 경우에는 Jolly Jumper의 조건에 해당하지 않기 때문)
  10. 다음 숫자를 입력받아 전 숫자와 비교를 해야 하니 pre변수에 현재 입력받은 숫자(now)를 넣어준다.
  11. 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