겹치는 선분의 길이

겹치는 선분의 길이를 구하는 문제이다. 

선분의 수가 많이 않기때문에 전체를 순회하며 횟수를 카운트하면 될 것 같다. 

쉽게 생각해보자면 선분 벡터를 순회하면서 시작점에서 부터 끝점까지 순회하면서 만약 선분에 걸쳐져있는 점이라면 횟수를 증가시켜 2개이상의 선분이 걸쳐진 점이라면 answer을 증가시켜준다. 

#include <string>
#include <vector>

using namespace std;
int line[200];
int solution(vector<vector<int>> lines) {
    int answer = 0;
    for (int i = 0; i < lines.size(); i++) {
        for (int j = lines[i][0]; j < lines[i][1]; j++) {               //시작점 ~ 도착점-1 까지에 있는 선분있다면 ++
            line[j + 100]++;                  //음수값도 양수값범위안에 들도록
        }
    }
    for (int i = 0; i < 200; i++) {
        if (line[i] >= 2) {
            answer++;
        }
    }
    return answer;
}

 

안전지대

 

지역을 순회하면서 만약 지뢰가 있다면 지역의 범위에서 벗어나지 않는 선에서 상하좌우 대각선의 지역을 안전지대를 표시하는 0과 지뢰가 있는 지역인 1인 수를 제외하고 할당해주고 안전지대를 체크하면된다.

#include <string>
#include <vector>

using namespace std;

int dx[8] = { -1,1,0,0,-1,-1,1,1 };     //상하좌우 대각선
int dy[8] = { 0,0,-1,1,-1,1,-1,1 };     //상하좌우 대각선
int solution(vector<vector<int>> board) {
    int answer = 0;
    for (int i = 0; i < board.size(); i++) {            //순회하면서 
        for (int j = 0; j < board[0].size(); j++) {         //위,아래,좌,우,대각선에 지뢰가 있다면 위험지역
            if (board[i][j] == 1) {
                for (int k = 0; k < 8; k++) {
                    int curx = i + dx[k];
                    int cury = j + dy[k];
                    if (curx >= 0 && curx < board.size() && cury >= 0 && cury < board.size()) {
                        if (board[curx][cury] != 1) board[curx][cury] = 2;                   //안전지대가 아니라고 지뢰가 있는건 아니라서 1과는 다른값으로 할당
                    }
                }
            }
        }
    }

    for (int i = 0; i < board.size(); i++) {            //순회하면서 
        for (int j = 0; j < board[0].size(); j++) {         //위,아래,좌,우,대각선에 지뢰가 있다면 위험지역
            if (board[i][j] == 0) answer++;
        }
    }
    return answer;
}

+ Recent posts