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;
}
반응형