728x90
삼성 SW Expert Academy
문제 1288. 새로운 불면증 치료법
링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV18_yw6I9MCFAZN&categoryId=AV18_yw6I9MCFAZN&categoryType=CODE&problemTitle=&orderBy=PASS_RATE&selectCodeLang=JAVA&select-1=2&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

조건

임의의 수 N의 배수들의 각 자리수에서 0~9 까지의 모든 숫자를 보는 시점이 몇배 일때인지 구하라.

ex)

N = 1295 라면

N x 1 = 1295 (현재 본 숫자는 1 2 5 9)

N x 2 = 2590 (현재 본 숫자는 0 1 2 5 9)

N x 3 = 3885 (현재 본 숫자는 0 1 2 3 5 8 9)

N x 4 = 5180 (현재 본 숫자는 0 1 2 3 5 8 9)

N x 5 = 6475 (현재 본 숫자는 0 1 2 3 4 5 6 7 8 9)

5배에서 0~9 까지의 모든 숫자를 보게된다.

입력

첫 줄에 테스트 케이스 갯수가 주어짐. 다음 줄부터 테스트 케이스 N이 주어짐.

단, N은 1이상 10^6이하 이다.

5
1
2
11
1295
1692

출력

'#테스트케이스번호 정답'의 형태로 출력

#1 10
#2 90
#3 110
#4 6475
#5 5076

예상분석

1) 크기가 10인 배열(arr)에 각 인덱스 값을 0으로 초기화한다.

2) N * i 를 (i는 1부터 시작) 구하고 해당 값의 각 자리수에 해당하는 수를 구한다.

2-1) (N * i)%10 을 반복하여 각 자리수에 해당하는 수를 구하는 방식이용

3) arr에 각 자리수에 해당하는 수를 인덱스 번호로 하여 해당 인덱스의 값을 1증가시킨다.

4) 위 과정을 i를 증가시켜가며 반복진행하다 arr의 모든 인덱스 값이 0이상이 되는 시점에 종료

5) 종료된 시점의 i값을 형태에 맞추어 출력한다.

6) 위 과정을 테스트 케이스의 갯수만큼 반복한다.

코드
import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.IntStream;

class Solution
{
    public static void main(String args[]) throws Exception {

        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();

        for (int test_case = 1; test_case <= T; test_case++) {

            int N = sc.nextInt();
            int num,idx;
            int[] arr = new int[10];
            int i = 1;

            while(true) {
                num = N*i;
                while (num > 0) {
                    idx = num%10;
                    arr[idx]++;
                    num /= 10;
                }
                if (!IntStream.of(arr).anyMatch(x -> x == 0)) {
                    System.out.println("#" + test_case + " " + N*i);
                    break;
                }
                i++;
            }


        }

    }
}

위 코드로 pass는 받았지만 딱 봐도 너무 어렵게 접근했지 않았나 싶다.

나름대로 시간복잡도를 생각해서 IntStream을 사용해보았다. 하지만 이미 반복문 중첩이 많아서 효율이 많이 떨어지는 것같다.

실제로 pass한 다른 유저들의 기록을 보니 메모리면에서나 실행시간면에서나 많이 차이가 났다.

조금 더 나은 코드를 짜기 위해 노력해보아야겠다.

728x90
728x90
삼성 SW Expert Academy
문제 1986. 지그재그 숫자
링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PxmBqAe8DFAUq&categoryId=AV5PxmBqAe8DFAUq&categoryType=CODE&problemTitle=&orderBy=PASS_RATE&selectCodeLang=JAVA&select-1=2&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

조건

1부터 N까지의 숫자에서 홀수는 더하고 짝수는 뺐을 때 최종 누적 값을 구하라.

ex)

N = 5 일때,

1-2+3-4+5 = 3

N = 6 일때,

1-2+3-4+5-6 = -3

 

단, N은 1이상 10이하의 정수.

입력

첫 줄에는 테스트 케이스의 갯수, 아래로 각 테스트 케이스(N)가 주어짐.

2
5
6

출력

각 줄은 '#테스트케이스번호'로 시작하고 공백을 두고 최종 누적 값을 출력.

#1 3
#2 -3

예상분석

1부터 N까지 반복문을 실행하되, 현재 값이 홀수인지 짝수인지 판별하여 연산자를 선택하여 연산하여 값을 누적 후 출력.

코드
import java.util.Scanner;

class Solution
{
    public static void main(String args[]) throws Exception {

        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();

        for (int i = 1; i <= T; i++) {
            int N = sc.nextInt();
            int sum = 0;
            for(int j = 1; j <= N; j++) {
                if (j%2 == 1) {
                    sum += j;
                } else if(j%2 == 0) {
                    sum -= j;
                }
            }
            System.out.println("#" + i + " " + sum);
        }

    }
}
728x90
728x90
삼성 SW Expert Academy
문제 1945. 간단한 소인수분해
링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5Pl0Q6ANQDFAUq&categoryId=AV5Pl0Q6ANQDFAUq&categoryType=CODE&problemTitle=&orderBy=PASS_RATE&selectCodeLang=JAVA&select-1=2&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

조건

숫자 N이 주어질 때, N을 소인수분해 하여

N = 2^a x 3^b x 5^c x 7^d x 11^e 일때 a,b,c,d,e를 출력하라.

단, N은 2이상 10000000이하 이다.

입력

첫 줄에는 테스트 케이스의 개수가 주어지고, 아래로 각 테스트 케이스가 주어짐(N).

10  
6791400
1646400
1425600
8575
185625
6480
1185408
6561
25
330750

출력

각 줄은 '#테스트케이스번호'로 시작하고 공백을 두고 정답을 출력한다

#1 3 2 2 3 1
#2 6 1 2 3 0
#3 6 4 2 0 1
#4 0 0 2 3 0
#5 0 3 4 0 1
#6 4 4 1 0 0
#7 7 3 0 3 0
#8 0 8 0 0 0
#9 0 0 2 0 0
#10 1 3 3 2 0

예상분석

1. 입력받은 N을 2로 나누어진다면 더 이상 2로 나누어지지 않을때까지 나눈다.

이때 나누어질때마다 2에 대응되는 변수a에 횟수를 누적한다.

  1-2. 2로 나누어지지 않는다면 다음인 3으로 넘어간다.

2. 위 과정을 반복하여 a,b,c,d,e를 구하고 공백을 두고 형태에 맞추어 출력한다.  

코드
import java.util.Scanner;

class Solution
{
    public static void main(String args[]) throws Exception {

        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        int num,a,b,c,d,e;

        for (int i = 1; i <= T; i++) {
            num = sc.nextInt();
            a=0;b=0;c=0;d=0;e=0;

            while (num%2 == 0) {
                num = num/2;
                a++;
            }

            while (num%3 == 0) {
                num = num/3;
                b++;
            }

            while (num%5 == 0) {
                num = num/5;
                c++;
            }

            while (num%7 == 0) {
                num = num/7;
                d++;
            }

            while (num%11 == 0) {
                num = num/11;
                e++;
            }

            System.out.println("#" + i + " " + a + " " + b + " " + c + " " + d + " " + e);
        }

    }
}
728x90
728x90
삼성 SW Expert Academy
문제 2047. 신문 헤드라인
링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&contestProbId=AV5QKsLaAy0DFAUq&categoryId=AV5QKsLaAy0DFAUq&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=JAVA&select-1=1&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

조건

신문의 헤드라인을 편집하기 위해, 주어지는 문자열의 알파벳을 모두 대문자로 바꾸는 프로그램을 작성하라.

단, 문자열의 최대 길이는 80 bytes이다.

입력

80 bytes 이하의 길이를 가진 문자열이 주어짐

출력

문자열의 소문자를 모두 대문자로 변경한 결과 출력

예상분석

입력받은 문자열을 String의 toUpperCase 함수를 이용하여 모든 알파벳을 대문자로 변경한 후 출력한다.

코드
import java.util.Scanner;

class Solution
{
    public static void main(String args[]) throws Exception {

        Scanner sc = new Scanner(System.in);
        String headline = sc.nextLine();

        System.out.println(headline.toUpperCase());

        sc.close();
    }
}
728x90
728x90
삼성 SW Expert Academy
문제 1545. 거꾸로 출력해 보아요
링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&contestProbId=AV2gbY0qAAQBBAS0&categoryId=AV2gbY0qAAQBBAS0&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=JAVA&select-1=1&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

조건

주어진 숫자부터 0까지 순서대로 출력하라

입력

8

출력

8 7 6 5 4 3 2 1 0

예상분석

입력값부터 -1씩 연산하여 출력하는 반복문을 0이 될때까지 실행한다.

코드
import java.util.Scanner;

class Solution
{
    public static void main(String args[]) throws Exception {

        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();

        while (T >= 0) {
            System.out.print(T-- + " ");
        }

        sc.close();
    }
}
728x90
728x90
삼성 SW Expert Academy
문제 2063. 중간값 찾기
링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=1&contestProbId=AV5QPsXKA2UDFAUq&categoryId=AV5QPsXKA2UDFAUq&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=JAVA&select-1=1&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

조건

중간값이란 통계 집단의 수치를 크기 순으로 배열 했을 때 전체의 중앙에 위치하는 수치를 말한다.

N 개의 점수가 주어졌을 때, 중간값을 출력하라.

단, N은 항상 홀수이고 9이상 199이하의 정수.

입력

첫 줄에 N이 주어지고 둘째 줄에 N개의 점수가 주어짐.

199
85 72 38 80 69 65 68 96 22 49 67 51 61 63 87 66 24 80 83 71 60 64 52 90 60 49 31 23 99 94 11 25 24 51 15 13 39 67 97 19 76 12 33 99 18 92 35 74 0 95 71 39 33 39 32 37 45 57 71 95 5 71 24 86 8 51 54 74 24 75 70 33 63 29 99 59 94 52 13 35 99 46 57 71 23 17 3 94 48 77 18 83 11 83 25 59 62 2 78 86 7 94 65 80 32 39 84 60 65 72 61 58 84 8 72 12 19 47 49 49 59 71 52 34 22 21 20 92 33 80 39 74 9 28 97 100 93 29 25 4 66 79 81 98 21 91 62 82 4 59 100 34 1 51 80 92 69 77 39 38 97 51 34 35 19 22 1 67 9 90 31 82 11 51 84 78 70 74 42 100 88 53 80 57 62 32 51 48 63 92 46 4 61 31 98 69 52 88 20

출력

N개의 점수 중 중간값에 해당하는 점수를 출력.

58

예상분석

1. N을 입력받아 크기가 N인 배열을 만들어 N개의 점수를 저장한다.

2. 배열을 sort 등을 통해 크기 순으로 정렬한다.

3. (N/2) 로 배열의 중간값에 해당하는 인덱스 번호로 값을 출력한다. (인덱스는 0부터 시작한다)

코드
import java.util.Arrays;
import java.util.Scanner;

class Solution
{
    public static void main(String args[]) throws Exception {

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();

        int[] arr = new int[N];

        for(int i = 0; i < arr.length; i++) {
            arr[i] = sc.nextInt();
        }
        Arrays.sort(arr);

        System.out.println(arr[(N/2)]);

        sc.close();
    }
}
728x90

+ Recent posts