Codeforces Round #739 (Div. 3)-A. Dislike of Threes
falconlee236
·2021. 12. 19. 15:32
문제 설명
효수는 3으로 나누어떨어지거나 정수의 맨 뒷자리수가 3인 정수를 매우 싫어한다.
민수는 효수가 좋아하는 수를 1부터 큰 순서대로 차례로 쓰고있다. $1, 2, 4, 5, 7, 8, 10, 11, 14, 16, ...$
우리가 해야할 것은 이 수열의 $k$번째 수를 찾는 것이다.
Input
첫번째 줄에는 테스트 케이스의 수 $t (1 \le t \le 100)$ 이 주어진다.
각 테스트 케이스의 첫번째 줄에는 정수 $k (1 \le k \le 1000)$ 가 주어진다.
Output
각 테스트케이스마다 민수가 쓴 수열의 $k$번째 수를 의미하는 정수 $x$를 출력한다.
Example
input
10
1
2
3
4
5
6
7
8
9
1000
output
1
2
4
5
7
8
10
11
14
1666
문제 접근
사용한 알고리즘: 구현, 수학
걸린 시간 : 00:02
진짜 한번 말리면 끝까지 말린다는 걸 여실히 깨닫게해준 문제이다. 원래라면 그냥 쉽게 풀 수 있는 문제인데 막상 대회에 들어가니까 머릿속이 하얗게 됐다. 그래서 실제 virtual contest에서 15분이나 걸렸다. 정신차리고 말리면 침착하게 다른 문제로 넘어가서 머리를 식히고 와야하는 것 같다.
먼저 수 $n$이 3으로 나누어 떨어지기 위한 조건은 $n ; mod ; 3 = 0$을 만족해야하고, 맨 뒤자리에 있는 수가 3이기 위한 조건은 $n ; mod ; 10 = 3$ 을 만족해야한다.
따라서 이 두 조건을 만족하면 효수가 싫어하는 수이기 때문에 우리가 구해야 하는 수가 아니다. 따라서 그 조건을 만족하면 continue로 $n$의 수를 줄이지 않는다.
정답 코드
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--){
int n, i; cin >> n;
for(i = 1; n; i++){
if(i % 3 == 0 || i % 10 == 3) continue;
n--;
}
cout << i - 1 << "\n";
}
return 0;
}
'알고리즘 > codeforces' 카테고리의 다른 글
Codeforces Round #739 (Div. 3)-C. Infinity Table (0) | 2021.12.19 |
---|---|
Codeforces Round #739 (Div. 3)-B. Who's Opposite? (0) | 2021.12.19 |
Codeforces Round #741 (Div. 2)-C. Rings (0) | 2021.12.19 |
Codeforces Round #741 (Div. 2)-B. Scenes From a Memory (0) | 2021.12.19 |
Codeforces Round #741 (Div. 2)-A. The Miracle and the Sleeper (0) | 2021.12.19 |