Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 프로그래머스
- DeferredRendering
- UE5
- GeeksForGeeks
- C
- NRVO
- 백준
- RVO
- Programmers
- 티스토리챌린지
- C++
- 줄 세우기
- 오블완
- RootMotion
- UnrealEngine5
- IFileDialog
- directx
- 팰린드롬 만들기
- Unreal Engine5
- const
- baekjoon
- Frustum
- 1563
- softeer
- 2294
- DirectX11
- winapi
- UnrealEngine4
- algorithm
- 언리얼엔진5
Archives
- Today
- Total
Game Develop
[Algorithm] Programmers :: 체육복 본문
https://programmers.co.kr/learn/courses/30/lessons/42862?language=cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
sort(lost.begin(), lost.end());
sort(reserve.begin(), reserve.end());
for (int i = 1; i <= n; i++) // 전처리과정. 도난당한사람과 여벌옷있는 사람은 검사에서 제외. 본인꺼 쓰니까.
{
auto t1 = find(lost.begin(), lost.end(), i) - lost.begin();
auto t2 = find(reserve.begin(), reserve.end(), i) - reserve.begin();
if (t1 != lost.size() && t2 != reserve.size()) // 같은값이 둘 다에 있으면,
{
lost.erase(lost.begin() + t1);
reserve.erase(reserve.begin() + t2);
}
}
for (int i = 0; i < lost.size(); i++)
{
int stand = lost[i];
for (int j = 0; j < reserve.size(); j++)
{
if (stand >= reserve[j] - 1 && stand <= reserve[j] + 1) // 빌릴 수 있으면,
{
// rserve[i] 삭제.
lost.erase(lost.begin() + i);
i--;
reserve.erase(reserve.begin() + j);
break;
}
}
}
return n - lost.size();
}
|
cs |
먼저 sort를 해준건, 문제에서 예시에는 오름차순으로 되어있는데 실제로는 아니라고 한다.
sort 해주기전에는 13,18번을 틀렸지만 sort를 해주니까 둘 다 통과가 뜨면서 문제를 해결했다.
다만, n의 크기나 lost,reserve의 사이즈가 클수록 효율적이지는 않은 코드다.
처음 전처리과정에서 lost랑 reserve에 같은 값이 있으면 삭제하게 했는데(여벌=도난당한 사람이 같은사람은 제외), 이런 경우는 n의 크기에 영향을 받는다. 일단 시행횟수는 n이다. 그리고 이 n번만큼 find함수를 실행하는데 find함수의 시간복잡도도 f(n)이다. 실제 밑에 답을 구하는 코드도 마찬가지고, 매개변수 벡터의 사이즈가 클 경우 아마 효율성에서 컷트가 나지 않았을까 한다.
위처럼 짜지말고, 아래처럼 짜는게 좋다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
int student[35];
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
for(int i : reserve) student[i] += 1;
for(int i : lost) student[i] += -1;
for(int i = 1; i <= n; i++) {
if(student[i] == -1) {
if(student[i-1] == 1)
student[i-1] = student[i] = 0;
else if(student[i+1] == 1)
student[i] = student[i+1] = 0;
}
}
for(int i = 1; i <=n; i++)
if(student[i] != -1) answer++;
return answer;
}
|
cs |
'Algorithm > Programmers' 카테고리의 다른 글
[Algorithm] Programmers :: 큰 수 만들기 (0) | 2022.05.26 |
---|---|
[Algorithm] Programmers :: 가장 큰 수 (0) | 2022.05.26 |
[Algorithm] Programmers :: 여행경로 (0) | 2022.05.21 |
[Algorithm] Programmers :: 짝지어 제거하기 (0) | 2022.05.20 |
[Algorithm] Programmers :: 네트워크 (0) | 2022.05.19 |