문제
길이가 N인 동가수열은 다음 두 조건을 만족하는 수열이다.
동가수열은 1 이상 N 이하인 정수로 이루어져 있고, 모든 원소는 서로 다르다.
동가수열의 서로 이웃한 원소의 차는 [N/2] 이상이다.
길이가 N인 동가수열을 아무거나 하나 구해보자. 주어지는 모든 입력에 대해 동가수열은 항상 존재한다.
입력
첫째 줄에 구하고자 하는 동가수열의 길이 N(1 ≤ N ≤ 5,000)이 주어진다.
출력
첫째 줄에 길이가 N인 동가수열을 아무거나 하나 출력한다. 동가수열은 공백으로 구분해서 출력해야 한다.
https://www.acmicpc.net/problem/25184
25184번: 동가수열 구하기
수열 $[2, 4, 1, 3]$은 $1$ 이상 $4$ 이하인 정수로 이루어져 있고, 모든 원소가 서로 다르다. 또한, 이웃한 원소의 차가 모두 $\lfloor \frac{4}{2} \rfloor$ $=$ $2$ 이상이다. 따라서 수열 $[2, 4, 1, 3]$은 동가
www.acmicpc.net
접근
최대 수 n이 정해지고, 근처 수와의 차가 [n/2] 이상으로 유지해야 합니다.
[n/2]를 diff라고 정의한다면
1, 1+diff, 2, 2+diff ,... 식으로 나열하게 되면 인접한 수의 차이는 diff, diff+1, diff, diff +1로 반복하는 형태를 보입니다.
n이 홀수라면 맨 끝에 n을 붙였습니다.
구현
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
//https://www.acmicpc.net/problem/25184
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int diff = n/2; //서로 이웃한 원소차
int left =diff; //왼쪽에 위치하는 수, 원소차의 값
int right = n%2==1?n-1:n; //오른쪽에 위치하는 수, 짝수면 n , 홀수면 n-1
//n/2 만큼 반복, 차이는 diff로 일정
for(int i=0;i<diff;i++) {
//왼쪽과 오른쪽 출력, 반복할때마다 왼쪽 오른쪽 모두 1씩 감소
bw.append(left-- + " ").append(right-- + " ");
}
//홀수라면 끝에 n 추가
if(n%2==1) {
bw.append(n+"\n");
}
bw.close();
br.close();
}
}
반응형
댓글