아이디어
- 기본적으로 1,2,...,a−1,max(a,b),b−1,b−2,...,2,1 순서를 유지하면 가희와 단비가 볼 수 있는 건물의 수에 대한 조건을 만족할 수 있다.
- 남은 빈 자리에는 높이 1의 건물을 가능한 왼쪽부터 채우면 될 것이다.
- 이때 a=1이면 1이 추가되었을 때 규칙이 깨지므로 그 다음 자리에 넣어야 한다.
- 만약 a>1이면 첫 번째 자리는 무조건 1이므로, 첫 번째 자리 앞 또는 뒤에 넣어도 상관 없다.
- 즉, 무조건 첫 번째 뒤, 두 번째 앞에 1을 넣으면 된다. (위의 조건으로 나눠도 상관은 없다)
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer tk = null;
static int N, a, b;
static List<Integer> list = new LinkedList<>();
public static void main(String[] args) throws Exception {
tk = new StringTokenizer(rd.readLine());
N = Integer.parseInt(tk.nextToken());
a = Integer.parseInt(tk.nextToken());
b = Integer.parseInt(tk.nextToken());
if (a + b - 1 > N) {
System.out.println(-1);
return;
}
for (int i=1; i <= a-1; i++)
list.add(i);
list.add(Math.max(a, b));
for (int i=b-1; i >= 1; i--)
list.add(i);
for (int i=0; i < N - (a + b - 1); i++)
list.add(1, 1);
for (int n: list)
sb.append(n).append(' ');
System.out.println(sb);
}
}
메모리 및 시간
리뷰
- 처음에 List를 안 쓰고 StringBuilder 만을 이용해서 풀려고 했다가, 1을 추가하는 과정에서 인덱스 관련 문제가 있어 결국...
틀린 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static BufferedReader rd = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer tk = null;
static int N, a, b;
public static void main(String[] args) throws Exception {
tk = new StringTokenizer(rd.readLine());
N = Integer.parseInt(tk.nextToken());
a = Integer.parseInt(tk.nextToken());
b = Integer.parseInt(tk.nextToken());
if (a + b - 1 > N) {
System.out.println(-1);
return;
}
for (int i=1; i <= a-1; i++)
sb.append(i).append(' ');
sb.append(Math.max(a, b)).append(' ');
for (int i=b-1; i >= 1; i--)
sb.append(i).append(' ');
for (int i=0; i < N - (a + b - 1); i++)
sb.insert(2, "1 ");
System.out.println(sb);
}
}