구름LEVEL
구름LEVEL 문제를 풀이하고 부족한 부분을 보완하며 실력을 키워보세요. 구름LEVEL은 코딩테스트에서 가장 높은 비중을 차지하는 알고리즘 문제를 제작하고 풀이할 수 있는 온라인 저지 서비스입
level.goorm.io
풀이
간단한 bfs 탐색문제
처음엔 dfs로 풀었는데, 시간초과로 인해 bfs로 재풀이
한 칸 한 칸 탐색하며 방문한적 없고 값이 1이 아닌 좌표들에 대해 bfs 실행 >> 해당 구역의 점수 반환
반환된 점수를 max 함수를 이용하여 maxVal에 저장
값 출력
int n; // 행
int m; // 열
int maxVal; // 구역 점수 중 가장 높은 점수
vector<vector<int>> input; // 입력값을 저장할 2차원 벡터
int visit[2001][2001] = {}; // bfs 탐색 시 방문 여부
int xdir[4] = {0, 1, 0, -1}; // nextX 를 위한 배열
int ydir[4] = {1, 0, -1, 0}; // nextY 를 위한 배열
int bfs(int x, int y) {
queue<pair<int, int>> q; // bfs를 위한 queue, x, y값 한번에 저장하기 위한 pair 컨테이너
q.push(make_pair(x, y)); // bfs의 시작좌표 (x, y)를 q에 삽입
visit[x][y] = 1; // 그 후, (x, y)를 방문했는 의미로 1로 값 변경
int score = 0; // 구역의 점수를 담을 score 변수 선언
// q가 비어있지 않다면 반복 >> 이어져 있는 구역이 있담면
while (!q.empty()) {
// 현재 탐색하고 있는 x, y 의 좌표값을 curX, curY에 담고
// queue 맨 앞의 좌표값을 pop()
int curX = q.front().first;
int curY = q.front().second;
q.pop();
// 현재 좌표의 값이 0이라면, 즉 비어있는 구역이라면 score + 1
if (input[curX][curY] == 0)
score += 1;
// 현재 좌표의 값이 2이라면, 비어있지만 장애인 구역이라면 score - 2
else if (input[curX][curY] == 2)
score -= 2;
// for문으로 현재 좌표의 상, 하, 좌, 우 4방향에 인접한 좌표 탐색
for (int i = 0; i < 4; i ++) {
// 인접한 좌표의 x, y 값
int nextX = curX + xdir[i];
int nextY = curY + ydir[i];
// 만약 인접 좌표가 전체 주차장 크기를 벗어나지 않으면서 아직 방문하지 않은 구역이라면
if (nextX >= 0 && nextY >= 0 && nextX < n && nextY < m && visit[nextX][nextY]==0 && input[nextX][nextY]!=1) {
// 방문으로 표시하고
visit[nextX][nextY] = 1;
// 좌표를 queue에 삽입
q.push(make_pair(nextX, nextY));
}
}
}
// queue가 비어 반복문이 종료되면 하나의 구역 탐색 완료
// score 에 그 구역의 점수를 담아 return
return score;
}
int main() {
// 주차장 구역의 크기 입력
cin >>n >> m;
// 반복문을 통해 주차장의 각 좌표값들을 input vector 컨테이너에 저장
for (int i = 0; i < n; i++) {
vector<int> temp;
for (int j = 0; j < m; j++) {
int value;
cin >> value;
temp.push_back(value);
}
input.push_back(temp);
}
// maxVal 초기화
maxVal = 0;
// 주차장 정보가 담겨있는 input vector를 한칸한칸 탐색하며 bfs 실행 >> 하나의 구역 점수 계산
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// 만약 현재 좌표가 아직 방문하지 않았고 값이 1이라면
if (visit[i][j] == 0 && input[i][j] !=1) {
// maxVal와 bfs를 통해 나온 한 구역의 점수를 비교하여 큰 쪽을 maxVal에 저장
maxVal = max(maxVal, bfs(i, j));
}
}
}
// 결과 출력
cout<< maxVal << endl;
}
'코딩테스트 > 문제풀이' 카테고리의 다른 글
[구름] 단풍나무 C++ (0) | 2023.07.10 |
---|---|
[구름] 뒤통수가 따가워 C++ (0) | 2023.07.07 |
[프로그래머스] 124나라의 숫자 C++ (0) | 2022.08.16 |
[프로그래머스] 올바른 괄호 C++ (0) | 2022.08.14 |
[프로그래머스] 같은 숫자는 싫어 C++ (0) | 2022.08.14 |