LeeTaes 공부노트

[프로그래머스/C++ 문제 풀이] Lv. 0 - 겹치는 선분의 길이 본문

코딩테스트/프로그래머스 (Lv. 0)

[프로그래머스/C++ 문제 풀이] Lv. 0 - 겹치는 선분의 길이

리태s 2024. 6. 19. 18:33
728x90
반응형

문제 설명

선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return 하도록 solution 함수를 완성해보세요.

lines가 [[0, 2], [-3, -1], [-2, 1]]일 때 그림으로 나타내면 다음과 같습니다.

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1]로 길이 2만큼 겹쳐있습니다.

제한 사항

  • lines의 길이 = 3
  • lines의 원소의 길이 = 2
  • 모든 선분은 길이가 1 이상입니다.
  • lines의 원소는 [a, b] 형태이며, a, b는 각각 선분의 양 끝점 입니다.
    • -100 ≤ a < b ≤ 100

입출력 예시

lines Result
[[0, 1], [2, 5], [3, 9]] 2
[[-1, 1], [1, 3], [3, 9]] 0
[[0, 5], [3, 9], [1, 10]] 8

 

입출력 예 #1

  • 두 번째, 세 번째 선분 [2, 5], [3, 9]가 [3, 5] 구간에 겹쳐있으므로 2를 return 합니다.

입출력 예 #2

  • 겹친 선분이 없으므로 0을 return 합니다.

입출력 예 #3

  • 첫 번째와 두 번째 선분이 [3, 5] 구간에서 겹칩니다.
  • 첫 번째와 세 번째 선분 [1, 5] 구간에서 겹칩니다.
  • 두 번째와 세 번째 선분 [3, 9] 구간에서 겹칩니다.
  • 따라서 [1, 9] 구간에 두 개 이상의 선분이 겹쳐있으므로, 8을 return 합니다.

문제 풀이

이번 문제는 저의 경우 배열을 미리 만들어 숫자가 겹치는 부분을 체크하는 방법으로 문제를 해결하였습니다.

라인을 정렬하고 순서대로 겹치는 부분을 쌓아나가는 방법도 있지만 간단하게 문제를 해결하기 위해 위 방법으로 문제를 해결하였습니다.

더보기

1. 배열을 미리 만들어 숫자가 겹치는 부분을 체크하는 방법

  • int 타입의 배열을 선언합니다.
// -100 ~ 100까지의 범위이므로 여유 공간을 생각해서 202로 지정하였습니다.
const int MAX = 202;
int arr[MAX];

 

2. 라인을 순회하며 arr 배열에 값을 부여합니다.

  • -100이 0번 인덱스에서 시작할 수 있도록 인덱스에 100을 더해 연산합니다.
for (vector<int> line : lines)
{
    for (int i = line[0]; i < line[1]; i++)
    {
        arr[i + 100]++;
    }
}

 

3. 전체 배열을 순회하며 카운트가 2 이상인 요소의 수를 더해 겹친 선분의 길이를 셉니다.

for (int i = 0; i < MAX; i++)
{
    if (arr[i] > 1)
        answer++;
}

 

정답 코드

#include <string>
#include <vector>

using namespace std;
const int MAX = 202;
int arr[MAX];

int solution(vector<vector<int>> lines) {
    int answer = 0;
    
    for (vector<int> line : lines)
    {
        for (int i = line[0]; i < line[1]; i++)
        {
            arr[i + 100]++;
        }
    }
    
    for (int i = 0; i < MAX; i++)
    {
        if (arr[i] > 1)
            answer++;
    }
    
    return answer;
}

 

728x90
반응형