24번 문제   

 


    내가 풀이한 답   

  배열 두 개를 가지고 코드를 짜 보았다. a 배열은 순전히 입력된 수만 저장하는 배열이고 b 배열은 인접한 두 수의 차이의 절대값을 index로 삼아 값을 바꿔주었다. 그래서 0이 아닌 값이 존재하면 유쾌한 점퍼(jolly jumper)가 아니므로 NO를 출력하고 모두 0이면 YES를 출력한다.

 

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv) {
	//freopen("input.txt", "rt", stdin);
	
	int n, i, temp;
	bool flag = true;
	scanf("%d", &n);
	
	int *a = (int *)malloc(sizeof(int)*n);
	int *b = (int *)malloc(sizeof(int)*n);
	
	for(i=0; i<n; i++){
		scanf("%d", &a[i]);
	}
	
	for(i=0; i<n-1; i++){
		temp = abs(a[i+1]-a[i]);
		b[temp] = 0;
	}
	
	for(i=1; i<n; i++){
		if(b[i]!=0){
			flag = false;
			break;
		}
	}
	
	if(flag) printf("%s", "YES");
	else printf("%s", "NO");
	
	free(a);
	free(b);

	return 0;
}

 

 결과는 통과하였다.

 

 


    사이트의 답안   

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	int n, i, now, pre, pos;
	scanf("%d", &n);
	vector<int> ch(n);
	scanf("%d", &pre);
    
	for(i=1; i<n; i++){
		scanf("%d", &now);
		pos=abs(pre-now);
		if(pos>0 && pos<n && ch[pos]==0) ch[pos]=1;
		else{
			printf("NO\n");
			return 0;
		}
		pre=now;
	}
    
	printf("YES\n");
	return 0;
}

 

  사이트의 답은 두 값의 차이의 절대값이 총 개수-1의 범위안에 있는지중복의 유무가 핵심이였다. 전 값 pre와 다음 값 now를 선언하고 두 값의 차이의 절대값을 pos 변수로 두었다. 제일 첫 번째 값을 pos로 입력을 받은 뒤 순회(for)를 돌며 절대값을 구하고 절대값이 총 개수보다 작은지를 판별하고 벡터의 pos 인덱스가 0인지를 확인하며 중복을 검사한다. 중복 값이 있다는 것은 나머지 부분에 무조건 공백이 존재한다는 것을 말해준다. 검사가 끝나면 pre값을 now로 바꿔주고 순회를 이어간다. 순회를 마치면 모든 값이 존재하므로 유쾌한 점퍼(Jolly Jumpers)가 된다.

 

 

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

26. 마라톤  (0) 2020.09.08
25. 석차 구하기  (0) 2020.09.08
23. 연속 부분 증가수열  (0) 2020.09.08
22. 온도의 최대값  (0) 2020.09.07
21. 카드게임  (0) 2020.09.07