백준 24337 '가희와 탑'

Bonwoong Ku·2023년 11월 15일
0

알고리즘 문제풀이

목록 보기
84/110

아이디어

  • 기본적으로 1,2,...,a1,max(a,b),b1,b2,...,2,11, 2, ..., a-1, \max(a, b), b-1, b-2, ..., 2, 1 순서를 유지하면 가희와 단비가 볼 수 있는 건물의 수에 대한 조건을 만족할 수 있다.
  • 남은 빈 자리에는 높이 1의 건물을 가능한 왼쪽부터 채우면 될 것이다.
    • 이때 a=1a = 1이면 1이 추가되었을 때 규칙이 깨지므로 그 다음 자리에 넣어야 한다.
    • 만약 a>1a > 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);
	}
}

메모리 및 시간

  • 메모리: 23232 KB
  • 시간: 240 ms

리뷰

  • 처음에 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);
	}
}
profile
유사 개발자

0개의 댓글