알고리즘 문제 풀이/SWEA

[SWEA]1288. 새로운 불면증 치료법(java)

v 2022. 3. 2. 21:42

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV18_yw6I9MCFAZN 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

문제에서 요구하는 것은 어떤 수의 자릿수 각각의 값들을 검증하는 것이라고 할 수 있다.

단순하게 풀면, 검증하기 위해 set에 넣어도 될 것 같은데, 비트마스킹을 이용해서 풀이해봤다.

먼저 어떤 수(N)은 검증을 완료할 때마다 같은 수가 더해지는 2N, 3N,,, 이 된다.

이 수를 10으로 나눠서 그 나머지를 확인해준다.

비트마스킹을 이용해서 확인하는 방법에는 1. &연산을 이용해서 숫자 지워주기, 2. |을 이용해서 2^10-1이 되는 지 확인해주기

둘 다 결국에 같은 거라 아무거나 사용해도 된다.

1. & 연산자 이용

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
32
33
34
35
36
37
38
39
import java.util.*;
import java.io.*;
class Solution
{
    public static void main(String args[]) throws Exception
   {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T;
        T=Integer.parseInt(br.readLine());
 
        for(int test_case = 1; test_case <= T; test_case++)
        {
            StringTokenizer st;
            st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int cur = 0;
            int validate = (1 << 10-1;
            int multi = 0;
            while(validate > 0) {
                //새로운 숫자 만들기.
                cur = N * (multi++);
                //검증하기
                while(cur > 0) {
                    int temp = cur % 10;
                    validate &= ~(1 << temp);
                    cur /= 10;
                }
            }
            System.out.println("#"+ test_case+ " "+ N * (multi-1));
        }
    }
}
cs

 

2. | 연산자 이용

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
import java.util.*;
import java.io.*;
 
class Solution
{
    public static void main(String args[]) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T;
        T=Integer.parseInt(br.readLine());
 
        for(int test_case = 1; test_case <= T; test_case++)
        {
            StringTokenizer st;
            st = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(st.nextToken());
            int cur = 0;
            int validate = 0;
            int multi = 0;
            while(true) {
                //검증하기
                while(cur > 0) {
                    int temp = cur % 10;
                    validate |= (1 << temp);
                    cur /= 10;
                }
                //종료 조건
                if(validate == 1023break;
 
                //새로운 숫자 만들기.
                cur = N * (multi++);
            }
            System.out.println("#"+ test_case+ " "+ N * (multi - 1));
        }
    }
}
cs
반응형