https://www.acmicpc.net/problem/4383
문제
Jolly jumper라 불리는 수열이 있다. 길이가 1인 수열은 무조건 Jolly jumper이고, 길이가 2이상일 때는 n개의 연속된 두 수의 차의 절댓값이 1부터 n-1까지 모두 나와야 Jolly jumper라고 한다. 예를 들어
1 4 2 3
이것은 Jolly jumper인데, 두 수의 차의 절댓값이 각각 3,2,1이기 때문이다. 하여튼 조건을 충족하면 어느 수열이든 Jolly jumper라 할 수 있다. 이제 각 케이스마다 Jolly jumper인지를 판별하자.
입력
각 줄의 첫 수로 n이 주어진다.(n < 3000) 그 다음에는 n개의 수가 주어진다.
일단 배열을 케이스마다 입력받고, i번째와 i+1번쨰의 차이의 절대값을 구해서 map에 넣어주었다.
map을 처음부터 끝까지 순회하면서 map에 있는 값들을 bool배열의 true로 바꿔주었고,
만약 1부터 N-1까지 bool배열의 값이 false가 있다면, Jolly jumper가 아니므로 이 경우에는 Not jolly를 출력하였다.
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int main(void){
while(cin >> n){
int arr[3001];
for(int i = 0;i<n;i++){
cin >> arr[i];
}
map<int,int> m;
map<int,int>::iterator iter;
bool isvalid = false;
for(int i = 0;i<n-1;i++){ //i번쨰와 i+1번쨰의 차이의 절대값을 map에 넣고
int diff = abs(arr[i] - arr[i+1]);
iter = m.find(diff);
if(iter == m.end()){
m.insert({diff,diff});
}
}
bool indexs[3001] = {false, };
for(iter = m.begin();iter != m.end();iter++){ //map 처음부터 끝까지 방문처리
int N = iter->second;
indexs[N] = true;
}
for(int i = 1;i<=n-1;i++){ //Jolly수열이 아닌경우
if(indexs[i] == false){
isvalid = true;
break;
}
}
if(isvalid == false || n == 1){
cout << "Jolly" << '\n';
}
else{
cout << "Not jolly" << '\n';
}
}
}
'알고리즘' 카테고리의 다른 글
백준 17182 우주 탐사선 C++ (0) | 2022.07.17 |
---|---|
백준 10384 팬그램 C++ (0) | 2022.07.16 |
백준 19699 소-난다! (0) | 2022.07.15 |
백준 18114 블랙 프라이데이 C++ (0) | 2022.07.15 |
백준 16953 A->B C++ (0) | 2022.07.15 |