Level 0. 겹치는 선분의 길이
각 선분이 지나는 점들의 값을 1씩 증가시켜 2 이상인 점의 개수를 찾아 해결했다.
값을 증가시키기 위해 순회하지 않고 범위를 이용해서 좀 더 효율적인 방법이 있나 찾아보았다.
겹치는 부분이 아니라 이어진 부분을 찾는 문제에서는 스위핑 기법 같은 것이 있었는데 이 문제에 대해서는 더 효율적인 방법을 찾을 수 없었다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> lines)
{
vector<int> v(200, 0);
for (vector<int>& line : lines)
for (int i = line[0]; i < line[1]; ++i)
++v[100 + i];
return count_if(v.begin(), v.end(), [](const int e) { return 1 < e; });
}
순차적으로 접근하는 for문이나 for_each() 함수 말고 성능을 위해 순차 접근을 보장하지 않는 transform() 함수를 사용하면 조금 더 빨리 수행할 수 있다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<vector<int>> lines)
{
vector<int> v(200, 0);
auto it_middle = v.begin() + 100;
for (vector<int>& line : lines)
transform(it_middle + line[0], it_middle + line[1], it_middle + line[0], [](const int e) { return e + 1; });
return count_if(v.begin(), v.end(), [](const int e) { return 1 < e; });
}
'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 0. 다항식 더하기 (0) | 2023.02.05 |
---|---|
Level 0. 분수의 덧셈 (0) | 2023.02.04 |
Level 0. 가까운 수 (0) | 2023.02.02 |
Level 0. 합성수 찾기 (0) | 2023.02.01 |
Level 0. 약수 구하기 (0) | 2023.01.31 |