728x90
1.문제
programmers.co.kr/learn/courses/30/lessons/64063/
2. 풀이
이 문제는 빈 방을 배정해 주었으면 그 방 현재 방 번호+1 또는 현재 방 번호+a 로 다음 빈 방번호를 가리키도록 갱신해주어야 한다.
이 방식을 어떻게 효율적으로하나 했더니 재귀함수를 이용해서 할 수 있었다.
즉, 재귀적으로 그 다음 빈 방 번호를 저장하는 것이다. (Union-find 방식)
그러면 O(nlogn)으로 해결 가능!
3. 코드
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
vector<long long> answer;
map<long, long> m;
long long find(long long num){
if(m[num] == 0){
answer.push_back(num);
m[num] = num + 1;
return num;
}
return m[num] = find(m[num]);
}
vector<long long> solution(long long k, vector<long long> room_number) {
long long size = room_number.size();
for(long long i=0; i<=size; i++){
m[i] = 0;
}
for(long long i=0; i<size; i++){
long long num = room_number[i];
if(m[num] ==0){
answer.push_back(num);
m[num] = num+1;
}
else{
find(m[num]);
}
}
return answer;
}
728x90
'코딩 테스트' 카테고리의 다른 글
[Codility] Lesson4. MissingInteger (Python) (0) | 2021.05.09 |
---|---|
[Codility] Lesson4. Max Counters (Python) (0) | 2021.05.09 |
[백준] 퇴사 (C++) (0) | 2021.04.13 |
[백준] 연산자 끼워넣기 (C++) (0) | 2021.04.13 |
[프로그래머스] 지형이동 (C++) (0) | 2021.04.12 |
댓글