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
- 코드 리뷰
- Gold 4
- c++
- pass
- 월간 코드 챌린지
- 2020 KAKAO BLIND
- next_permutation
- Gold 5
- 백준
- 그리디
- 백트래킹
- 프로그래머스
- 구현
- DP
- 2019 KAKAO BLIND
- level 1
- Level 3
- 코드리뷰
- BFS
- SWEA
- Level 4
- DFS
- 브루트포스
- Level 2
- 스택/큐
- 2020 카카오 인턴십
- 시뮬레이션
- 삼성 SW 역량 테스트
- 부스트코스
- Web
Archives
- Today
- Total
Min:D's Devlog
[SWEA][모의 SW 역량테스트][C++] 4014 활주로 건설 본문
문제
SWEA 모의 SW 역량 테스트 - 4014 활주로 건설
문제 풀이
접근 방식
설치 가능한 경사로를 찾기 위해 가로 방향과 세로 방향으로 각각 탐색해주어야 한다.
그래서 편의를 위해 map 벡터를 2N×N 크기로 만들어서 가로 방향과 세로 방향으로 넣어주었다.
이렇게 하면 나중에 이중 for문을 두번 돌리지 않아도 된다.
vector<vector<int>> map(N * 2, vector<int>(N));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
map[j + N][i] = map[i][j];
}
}
활주로 건설이 가능한 길인지는 3가지 조건으로 판단해 볼 수 있다.
-
같은 높이인 경우
-
1칸 더 높으나, 경사로를 설치할 수 있는 경우
-
1칸 더 낮으나, 경사로를 설치할 수 있는 경우
2번의 경우는, 지금까지 탐색한 같은 높이의 칸의 수가 X(경사로의 가로 길이)보다 크거나 같은 경우이다.
이를 쉽게 판단하기 위해 1번의 경우일 때, count 변수를 1씩 증가시켜주었다.
3번의 경우는, 앞으로 가야할 칸과 같은 높이의 칸수가 X만큼 되는 경우이다.
이는 X 크기만큼 for문을 돌려 확인해주었다.
위의 조건들을 만족하지 못하면 check 변수를 false로 바꾸고 반복문을 나가도록 설정해주었고,
모두 만족하여 check가 true인 경우에는 answer++를 실행해주어 최종 답을 구하였다.
풀이 코드 - C++
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char **argv)
{
int test_case;
int T, N, X;
// freopen("input.txt", "r", stdin);
cin >> T;
for (test_case = 1; test_case <= T; ++test_case) {
cin >> N >> X;
vector<vector<int>> map(N * 2, vector<int>(N));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
map[j + N][i] = map[i][j];
}
}
int answer = 0;
for (int i = 0; i < N * 2; i++) {
int now = map[i][0];
int count = 1;
bool check = true;
for (int j = 1; j < N; j++) {
if (map[i][j] == now) { // 같은 높이인 경우
count++;
continue;
}
if (map[i][j] - now == 1) { // 1칸 더 높은 경우
if (count >= X) {
now = map[i][j];
count = 1;
continue;
}
check = false;
break;
}
if (map[i][j] - now == -1) { // 1칸 더 낮은 경우
now = map[i][j];
count = 1;
for (int k = 1; k < X; k++) {
j++;
if (j < N && map[i][j] == now)
count++;
}
if (count == X) {
count = 0;
continue;
}
check = false;
break;
}
check = false;
break;
}
if (check)
answer++;
}
cout << "#" << test_case << " " << answer << endl;
}
return 0;
}
실행 결과
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA][모의 SW 역량테스트][C++] 2115 벌꿀채취 (0) | 2020.07.28 |
---|---|
[SWEA][모의 SW 역량테스트][C++] 1952 수영장 (0) | 2020.07.24 |
[SWEA][모의 SW 역량테스트][C++] 4008 숫자 만들기 (0) | 2020.07.19 |
[SWEA][모의 SW 역량테스트][C++] 4013 특이한 자석 (0) | 2020.07.17 |
[SWEA][모의 SW 역량테스트][C++] 4012 요리사 (0) | 2020.07.09 |
Comments