일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- p-value
- 자료구조
- Anti Cheat
- AA test
- 스택
- Python
- c++
- BFS
- Queue
- Machine learning
- ML
- 7569번
- anomaly detection
- Game Data Analysis
- 백준
- datascience
- classification
- Stack
- 통계
- 딥러닝
- Deeplearning
- DP
- 중앙갑
- 정렬
- 구현
- Journal Review
- 큐
- 알고리즘
- 그리디
- cs231n
- Today
- Total
Software Hyena::
[백준 11116번] - 교통량 / C++ 본문
www.acmicpc.net/problem/11116
11116번: 교통량
승민이는 마포대교의 교통량이 얼마인지를 측정하고있다. 승민이는 도로 맞은 편을 잇는 두개의 끈을 일정 간격 사이로 매달아 놓았다. 그리고 자동차가 끈위로 지나갈때 끈 끝에 있는 작은
www.acmicpc.net
문제
승민이는 마포대교의 교통량이 얼마인지를 측정하고있다. 승민이는 도로 맞은 편을 잇는 두개의 끈을 일정 간격 사이로 매달아 놓았다. 그리고 자동차가 끈위로 지나갈때 끈 끝에 있는 작은 박스에는 그 때 의 시간이 기록된다.
예를 들어, 자동차가 왼쪽에서 올 때 네 번의 기록을 얻게 된다.
- 왼쪽 줄 위로 앞 바퀴가 지나 간 시간 t
- 왼쪽 줄 위로 뒷 바퀴가 지나 간 시간 t + 500
- 오른쪽 줄 위로 앞 바퀴가 지나 간 시간 t + 1000
- 오른쪽 줄 위로 뒷 바퀴가 지나 간 시간 t + 1500
자동차가 오른쪽에서 올 때도 같은 규칙으로 오른쪽과 왼쪽을 바꾸어 측정하면 된다. 주어진 두개의 시간 기록으로 왼쪽에서 얼마나 많은 차가 왔는지 알아내면 된다. 한 끈 위에는 많아야 한 대의 차량이 지나가고 있다.
입력
첫 번째 줄에 n (1 ≤ n ≤ 100) 까지의 테스트 케이스의 개수를 입력 한다. 각각의 테스트 케이스에는 박스에서 측정 된 시간 기록의 개수 m (m ≤ 200)을 입력한다. 다음 줄에는 왼쪽 박스에서 측정된 109 보다 작은 시간 기록 m개를 입력한다. 그 다음 줄에는 오른쪽 박스에서 측정된 109 보다 작은 시간 기록 m개를 입력한다.
출력
각각의 테스트케이스에 대해 왼쪽에서 오는 차의 숫자를 출력한다.
---------------------------------------------------------------------------------------------------------
풀이
<C++>
#include <iostream>
using namespace std;
int arr_right[201];
int arr_left[201];
int main() {
int n;
cin >> n;
for (int j = 0; j < n; ++j) {
int left_car = 0;
int m;
cin >> m;
for (int i = 0; i < m; ++i) {
cin >> arr_left[i];
}
for (int i = 0; i < m; ++i) {
cin >> arr_right[i];
}
for (int i = 0; i < m-1; ++i) {
for (int j = i+1; j < m; ++j) {
if (arr_left[i] + 500 == arr_left[j]) {
for (int k = 0; k < m; ++k) {
if (arr_left[j] + 500 == arr_right[k]) {
left_car += 1;
break;
}
}
}
}
}
cout << left_car << '\n';
}
return 0;
}
왼쪽에서 자동차가 오든, 오른쪽에서 자동차가 오든 측정시간간의 500의 차이가 존재한다. 문제에서 언급한 t값을 이용하여 풀이를 하도록 하겠다. 완벽한 풀이는 아니고 생각의 흐름대로 푼 풀이이니 참고하시길.
1. n값을 입력받고, m값을 입력받은후, 왼쪽의 값, 오른쪽의 값을 각각 입력받은 후 arr_left 와 arr_right 에 값을 넣는다.
2. arr_left의 값중 t 값보다 500이 큰 값이 존재하는지 찾는다.
3. 존재할경우 t + 500 값보다 500이 더 큰, 즉 t + 1000 의 값이 arr_right에 존재하는지 찾는다.
- 500 차이가 나는 값은 무조건 존재하므로 왼쪽의 값보다 오른쪽의 값이 큰 지만 확인하면 왼쪽에서 온 자동차임이 확실해지기 때문.
4. arr_right 에 값이 존재할 경우 left_car 변수에 1을 더하고 모든 반복이 끝나면 left_car 값을 출력한다.
더 좋은 방법이 분명 존재할 것 같다. 더 좋은 방법 있다면 댓글로 알려주세요.. ㅎ
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2839번] - 설탕 배달 / C++ (0) | 2021.02.20 |
---|---|
[백준 10814번] - 나이순 정렬/ C++ (0) | 2021.02.20 |
[백준 1010번] - 다리놓기 / C++ (0) | 2021.02.18 |
[백준 1059번] - 좋은 구간 / C++ (0) | 2021.02.18 |
[백준 1003번] - 피보나치 함수/C++ (0) | 2021.02.17 |