본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.
문의는 댓글 바람.
문제 출처 : https://www.acmicpc.net/problem/1138
[문제 설명]
[접근 방법]
완전탐색 태그로 본 문제다 보니, 바로 완전탐색밖에 떠오르지 않았다.
저번에 이렇게 아무 생각도 안하고 풀었다가 시간초과로 호되게 당한 적이 있기 때문에 완전탐색의 시간복잡도를 먼저 구했다.
N명의 사람들을 줄 세우는 방법은 O(N!), N은 최대 값이 9이므로 9!이 된다. 따라서 362,880이다.
여기서 끝나는 게 아니라 입력 받은 배열들이 세워진 줄과 조건이 일치하는지 확인해야한다.
첫번째 입력 예시로 들면
2,1,1,0인데 이를 모든 줄과 비교해봐야 한다.
1,2,3,4 -> 2,1,1,0 만족안함
1,2,4,3 -> 2,1,1,0 만족안함
....
..
4,2,1,3 -> 2,1,1,0 만족함
-> 4 2 1 3 출력
이 작업은 n^2의 시간이 든다.
따라서, 이 방법을 사용했을 때 총 시간복잡도는 N!(모든 줄의 경우의 수)xN(줄의 길이)x(비교할 줄의 길이) -> O(N!*N^2)이 된다.
연산 횟수가 3600만으로 대략 통과가 되지만, 너무 생각도 안하고 태그만 보고 푸는 느낌이라 이 방법은 안썼다.
두번째 방법은 마지막 숫자부터 세워주는 방법이다.
2,1,1,0의 경우
마지막 숫자의 키는 4이고 앞의 자기보다 큰 수는 0이다.
따라서 0번째 위치에 넣는다.
-> 4
3번째 숫자는 자기보다 큰 수가 1개.
따라서 1번째 위치에 넣는다.
-> 4 3
2번째 숫자는 자기보다 큰 수가 1개다.
따라서 1번째 위치에 넣는다.
-> 4 2 3
1번째 숫자는 자기보다 큰 수가 2개다
따라서 2번째 위치에 넣는다
-> 4 2 1 3
이 방법의 시간복잡도는 N(인원수)xN(리스트에 삽입 연산 시간복잡도) => O(N^2)이 된다.
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int numOfPeoples = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int[] arrayOfIndex = new int[numOfPeoples];
List<Integer> list = new LinkedList<>();
int index = 0;
while (st.hasMoreTokens()) {
arrayOfIndex[index++] = Integer.parseInt(st.nextToken());
}
int height = numOfPeoples;
for (int i = arrayOfIndex.length - 1; i >= 0; i--) {
list.add(arrayOfIndex[i], height--);
}
list.forEach(it -> System.out.print(it+" "));
}
}
'알고리즘 문제 풀이 > 완전탐색' 카테고리의 다른 글
백준 - 계란으로 계란치기 (Java) (0) | 2022.01.17 |
---|---|
백준 - 0의 개수(java) (0) | 2022.01.16 |
백준 - 1(JAVA) (0) | 2022.01.04 |
백준 - 마인크래프트 (0) | 2021.12.31 |
백준 - 꽃길 (0) | 2021.12.31 |