본문 바로가기
학부공부/Java_Basic

Chapter 6. Methods[Java Basic]

by sonpang 2021. 11. 5.
반응형

6.A - Palindrome 수

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

정수를 입력으로 받아 palindrome 숫자인지 체크하는 프로그램을 작성하세요. 왼쪽에서 오른쪽으로 읽는 것과 오른쪽에서 왼쪽으로 읽는 것이 동일할 경우 palindrome 숫자라고 합니다.

Write a test program that prompts the user to enter an integer and reports whether the integer is a palindrome. A number is palindrome if it reads the same from right to left and from left to right.

 

INPUT

* Line 1 : 테스트케이스 T (1~1,000)

* Line 2 ~ T+1 : 정수 (1~1,000,000)

 

OUTPUT

* Line 1 ~ T : palindrome 숫자일 경우 Y, 아닐경우 N을 출력

 

SAMPLE INPUT

4

1

1221

12321

132

 

SAMPLE OUTPUT

Y

Y

Y

N

 

import java.util.Scanner;
public class Main {
    private static void check_pal(int n){
        int ncopy = n, pal = 0;
        while(n != 0){
            pal *= 10;
            pal += n % 10;
            n /= 10;
        }
        if(pal == ncopy)
            System.out.println("Y");
        else
            System.out.println("N");
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i, data[] = new int[n];
        for(i = 0; i < n; i++)
            data[i] = input.nextInt();
        for(i = 0; i < n; i++)
            check_pal(data[i]);
    }
}

 

 

6.B - 뒤집혀진 정수

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

정수 I를 입력받아 역순으로 출력하는 프로그램을 작성하세요. 예를 들어, reverse(3456)는 6543으로 출력되어야 합니다. 330은 033으로 출력되어야 합니다.

Write a test program that prompts the user to enter an integer I and displays its reversal. For example, reverse(3456) displays 6543. Also, reverse(330) displays 033.

 

INPUT

* Line 1 : 테스트케이스 T (1~1,000)

* Line 2 ~ T+1 : 정수 (1~1,000,000)

 

OUTPUT

* Line 1 ~ T : 뒤집혀진 숫자

 

SAMPLE INPUT

3

22

3215

111011

 

SAMPLE OUTPUT

22

5123

110111

 

import java.util.Scanner;
public class Main {
    private static void reverse(int n){
        String reverse = new String();
        while(n != 0){
            reverse += Integer.toString(n % 10);
            n /= 10;
        }
        System.out.println(reverse);
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i, data[] = new int[n];
        for(i = 0; i < n; i++)
            data[i] = input.nextInt();
        for(i = 0; i < n; i++)
            reverse(data[i]);
    }
}

 

 

6.C - 타당한 암호는?

Time Limit: 1s Memory Limit: 128MB

DESCRIPTION

몇몇 웹사이트에서는 특정 규칙을 만족하는 패스워드만 사용할 수 있게 한다. 당신은 다음과 같은 패스워드 생성 규칙이 주어졌을때, 입력으로 들어온 문자열이 패스워드로 타당한지 체크하는 프로그렘을 작성하려고 한다.

■ 패스워드는 적어도 8글자 이상이어야 한다

■ 패스워드는 문자와 숫자로만 구성되어야 한다 (특수기호 허용안함)

■ 패스워드는 적어도 2개 이상의 숫자를 포함해야 한다

만약 타당한 패스워드라면 Valid를 타당하지 않다면 Invalid를 출력하면 된다.

Some websites impose certain rules for passwords. Write a method that checks whether a string is a valid password. Suppose the password rules are as follows:

■ A password must have at least eight characters.

■ A password consists of only letters and digits.

■ A password must contain at least two digits.

Write a program that prompts the user to enter a password and displays Valid Password if the rules are followed or Invalid Password otherwise.

 

INPUT

* Line 1 : 테스트케이스 T (1~1,000)

* Line 2 ~ T+1 : 공백이 포함되지 않은 패스워드(길이는 100을 넘지 않는다)

 

OUTPUT

* Line 1 ~ T : 타당하면 Valid를 타당하지 않다면 Invalid를 출력

 

SAMPLE INPUT

3

ABCD1234_

QWERTY

qwerty1234

 

SAMPLE OUTPUT

Invalid

Invalid

Valid

 

 

import java.util.Scanner;
public class Main {
    private static boolean check(String data){
        char c;
        if(data.length() >= 8){
            int count = 0, i;
            for(i = 0; i < data.length(); i++){
                c = data.charAt(i);
                if('0' <= c && c <='9')
                    count++;
                else if(('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'));
                else
                    return false;
            }
            if(count >= 2)
                return true;
        }
        return false;
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i;
        String data[] = new String[n];
        input.nextLine();
        for(i = 0; i < n; i++)
            data[i] = input.nextLine();
        for(i = 0; i < n; i++)
            System.out.println(check(data[i]) ? "Valid" : "Invalid");
    }
}

 

 

6.D - 핸드폰 키패드

Time Limit: 1s Memory Limit: 128MB

DESCRIPTION

핸드폰의 국제표준 키매핑은 다음 그림과 같습니다.

The international standard letter/number mapping for telephones is shown as follows:

문자열 형태의 전화번호를 입력으로 받아, 올바른 전화번호로 변환해 주는 프로그램을 작성하세요. 입력으로 들어온 전화번호에 대소문자 형태의 알파벳이 포함되어 있다면 숫자로 변환 해주어야 합니다.

Write a test program that prompts the user to enter a phone number as a string. The input number may contain letters. The program translates a letter (uppercase or lowercase) to a digit and leaves all other characters intact.

 

INPUT

* Line 1 : 테스트케이스 T (1~1,000)

* Line 2 ~ T+1 : 공백이 포함되지 않은 전화번호(길이는 100을 넘지 않는다)

 

OUTPUT

* Line 1 ~ T : 변환된 전화번호

 

SAMPLE INPUT

2

1-800-Flowers

1800flowers

 

SAMPLE OUTPUT

1-800-3569377

18003569377

 

import java.util.Scanner;
public class Main {
    private static void trans(String s){
        int i;
        char c;
        s = s.toLowerCase();
        for(i = 0; i < s.length(); i++){
            c = s.charAt(i);
            if('a' <= c && c <= 'o')
                c = (char) ((c - 'a')/3 + '2');
            else if('p' <= c && c <= 's')
                c = '7';
            else if('t' <= c && c <= 'v')
                c = '8';
            else if('w' <= c && c <= 'z')
                c = '9';
            System.out.print(c);
        }
        System.out.println();
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i;
        input.nextLine();
        String data[] = new String[n];
        for(i = 0; i < n; i++)
            data[i] = input.nextLine();
        for(i = 0; i < n; i++)
            trans(data[i]);
    }
}

 

반응형

 

6.E - Palindromic 소수

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

Palindromic 소수는 소수이면서 동시에 palindromic한 수를 말합니다. 예를 들어, 131은 두가지 조건을 모두 만족하므로 Palindromic 소수입니다. 여러분은 최대값 M을 입력받아, 0부터 M까지 Palindromic 소수가 몇개 존재하는지 출력하는 프로그렘을 작성해야 합니다.

A palindromic prime is a prime number and also palindromic. For example, 131 is a prime and also a palindromic prime, as are 313 and 757. Write a program that prompts the user to enter a max M and displays the number of palindromic prime numbers between 0 and M.

 

INPUT

* Line 1 : 테스트케이스 T (1~100)

* Line 2 ~ T+1 : 정수 (1~10,000)

 

OUTPUT

* Line 1 ~ T : palindromic 소수의 개수

 

SAMPLE INPUT

3

11

180

900

 

SAMPLE OUTPUT

5

8

18

 

import java.util.Scanner;
public class Main {
    private static boolean pal(int n){
        int ncopy = n, pal = 0;
        while(n != 0){
            pal *= 10;
            pal += n % 10;
            n /= 10;
        }
        if(ncopy == pal)
            return true;
        return false;
    }
    private static boolean prime(int n){
        int i;
        for(i = 2; i <= n / 2; i++){
            if(n % i == 0)
                return false;
        }
        if(pal(n))
            return true;
        return false;
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i, j, data[] = new int[n], count;
        for(i = 0; i < n; i++)
            data[i] = input.nextInt();
        for(i = 0; i < n; i++){
            for(j = 2, count = 0; j <= data[i]; j++)
                if(prime(j))
                    count++;
            System.out.println(count);
        }
    }
}

 

Time Limit Exceed
import java.util.Scanner;
public class Main {
    private static boolean pal(int n){
        int ncopy = n, pal = 0;
        while(n != 0){
            pal *= 10;
            pal += n % 10;
            n /= 10;
        }
        if(ncopy == pal)
            return true;
        return false;
    }
    private static boolean prime(int n){
        int i;
        for(i = 2; i <= n / 2; i++){
            if(n % i == 0)
                return false;
        }
        if(pal(n))
            return true;
        return false;
    }
    private static void pal_prime(int n, int data[]){
        int ans[] = new int[n], i, j, count = 0, check = 0;
        for(i = 2; check != n; i++){
            if(prime(i))
                count++;
            for(j = 0; j < n; j++){
                if(data[j] == i){
                    ans[j] = count;
                    check++;
                }
            }
        }
        for(i = 0; i < n; i++)
            System.out.println(ans[i]);
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i, data[] = new int[n];
        for(i = 0; i < n; i++)
            data[i] = input.nextInt();
        pal_prime(n, data);
    }
}

 

 

6.F - 쌍둥이 소수

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

쌍둥이 소수는 정확히 2의 차이를 가지고 있는 소수 쌍을 말합니다. 예를 들어, 3과 5는 쌍둥이 소수이고 5와 7도 쌍둥이 소수입니다. 또한 11과 13도 쌍둥이 소수입니다. 여러분은 최대값 M을 입력받아, 0부터 M까지 쌍둥이 소수가 몇개 존재하는지 출력하는 프로그램을 작성해야 합니다.

Twin primes are a pair of prime numbers that differ by 2. For example, 3 and 5 are twin primes, 5 and 7 are twin primes, and 11 and 13 are twin primes. Write a program that prompts the user to enter a max M and displays the number of twin prime numbers between 0 and M.

 

 

INPUT

* Line 1 : 테스트케이스 T (1~100)

* Line 2 ~ T+1 : 정수 (1~10,000)

 

OUTPUT

* Line 1 ~ T : 쌍둥이 소수의 개수

 

SAMPLE INPUT

3

10

30

100

 

SAMPLE OUTPUT

2

4

8

 

HINT

에라토스테네스의 체를 씁시다!

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i, j, k, data[] = new int[n], count;
        for(i = 0; i < n; i++)
            data[i] = input.nextInt();
        for(i = 0; i < n; i++){
            int sieve[] = new int[data[i] + 1];
            sieve[0] = sieve[1] = 1;
            count = 0;
            for(j = 2; j <= data[i]; j++){
                if(sieve[j] == 1)
                    continue;
                k = j;
                while((k += j) <= data[i])
                    sieve[k] = 1;
                if(sieve[j - 2] + sieve[j] == 0)
                    count++;
            }
            System.out.println(count);
        }
    }
}

 

6.G - 경제: 타당한 신용카드번호

Time Limit: 1s Memory Limit: 128MB

DESCRIPTION

신용카드 번호는 일정한 규칙을 가지고 있습니다. 신용카드 번호는 13~16개의 숫자로 되어 있고, 카드 회사에 따라 다음과 같은 숫자로 시작합니다.

Credit card numbers follow certain patterns. A credit card number must have between 13 and 16 digits. It must start with:

■ 4 for Visa cards

■ 5 for Master cards

■ 37 for American Express cards

■ 6 for Discover cards

1954년 IBM의 Hans Luhn는 신용카드 번호가 타당한지 체크하는 알고리즘을 제안하였습니다. 그 알고리즘은 카드번호가 올바르게 입력되었는지 체크하거나 카드리더기가 번호를 올바르게 인식했는지 체크하는 용도로 유용히 사용되어 왔습니다. Luhn check 또는 Mod 10 check로 알려진 체크 알고리즘은 다음과 같습니다. (설명을 위해 카드번호는 4388576018402626로 간주):

In 1954, Hans Luhn of IBM proposed an algorithm for validating credit card numbers. The algorithm is useful to determine whether a card number is entered correctly or whether a credit card is scanned correctly by a scanner. Credit card numbers are generated following this validity check, commonly known as the Luhn check or the Mod 10 check, which can be described as follows (for illustration, consider the card number 4388576018402626):

 

1. 오른쪽에서 왼쪽으로 짝수위치의 숫자들을 각각 두배합니다. 만약 두배된 숫자가 10이상이면 십의 자리와 일의 자리의 숫자를 더해서 한자리 숫자로 만듭니다. (Double every second digit from right to left. If doubling of a digit results in a two-digit number, add up the two digits to get a single-digit number)

2. 단계1에서 구한 모든 숫자를 더합니다. (Now add all single-digit numbers from Step 1)

4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37

3. 오른쪽에서 왼쪽으로 홀수 위치의 숫자들을 모두 더합니다. (Add all digits in the odd places from right to left in the card number.)

6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38

4. 단계2와 단계3에서 구한 숫자를 더합니다. (Sum the results from Step 2 and Step 3.)

37 + 38 = 75

5. 단계4에서 구한 숫자가 10으로 나누어 떨어지면, 카드번호는 타당합니다. 예를 들어, 4388576018402626 번호는 신용카드 번호로써 타당하지 않지만 4388576018410707는 타당한 신용카드 번호 입니다. (If the result from Step 4 is divisible by 10, the card number is valid; otherwise, it is invalid. For example, the number 4388576018402626 is invalid, but the number 4388576018410707 is valid.)

 

신용카드 번호를 입력 받아서 타당하다면 Valid를 타당하지 않다면 Invalid를 출력하는 프로그램을 작성하세요. (long integer로 입력받아야 오류를 피할 수 있을 것입니다)

Write a program that prompts the user to enter a credit card number as a long integer. Display whether the number is valid or invalid.

 

INPUT

* Line 1 : 테스트케이스 T (1~1,000)

* Line 2 ~ T+1 : 신용번호 (13~16자리 정수)

 

OUTPUT

* Line 1 ~ T : 타당한 신용카드 번호면 Valid를 그렇지 않다면 Invalid를 출력

 

SAMPLE INPUT

2

4388576018410707

4388576018402626

 

SAMPLE OUTPUT

Valid

Invalid

 

import java.util.Scanner;
public class Main {
    private static void check(long n){
        long ncopy1 = n * 100, ncopy2 = n, sum = 0, temp;
        while(ncopy2 >= 100)
            ncopy2 /= 10;
        if(ncopy2 / 10 != 4 && ncopy2 / 10 != 5 && ncopy2 / 10 != 6 && ncopy2 != 37){
            System.out.println("Invalid");
            return;
        }
        while(n != 0){
            temp = ((n /= 10) % 10) * 2;
            n /= 10;
            temp = (temp / 10) + temp % 10;
            sum += temp;
        }
        while(ncopy1 != 0)
            sum += (ncopy1 /= 100) % 10;
        if(sum % 10 == 0)
            System.out.println("Valid");
        else
            System.out.println("Invalid");
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i;
        long data[] = new long[n];
        for(i = 0; i < n; i++)
            data[i] = input.nextLong();
        for(i = 0; i < n; i++)
            check(data[i]);
    }
}

 

Wrong Answer
import java.util.Scanner;
public class Main {
    private static void check(long n){
        long ncopy = n * 100, sum = 0, temp;
        while(n != 0){
            temp = ((n /= 10) % 10) * 2;
            n /= 10;
            if(temp >= 10)
                sum += (temp / 10) + temp % 10;
            else
                sum += temp;
        }
        while(ncopy != 0)
            sum += (ncopy /= 100) % 10;
        if(sum % 10 == 0)
            System.out.println("Valid");
        else
            System.out.println("Invalid");
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i;
        long data[] = new long[n];
        for(i = 0; i < n; i++)
            data[i] = input.nextLong();
        for(i = 0; i < n; i++)
            check(data[i]);
    }
}

 

Wrong Answer
import java.util.Scanner;
public class Main {
    private static void check(long n){
        long ncopy1 = n * 100, ncopy2 = n, sum = 0, temp;
        while(ncopy2 < 100)
            ncopy2 /= 10;
        if(!(ncopy2 / 10 == 4 || ncopy2 / 10 == 5 || ncopy2 / 10 == 6 || ncopy2 == 37)){
            System.out.println("Invalid");
            return;
        }
        while(n != 0){
            temp = ((n /= 10) % 10) * 2;
            n /= 10;
            temp = (temp / 10) + temp % 10;
            sum += temp;
        }
        while(ncopy1 != 0)
            sum += (ncopy1 /= 100) % 10;
        if(sum % 10 == 0)
            System.out.println("Valid");
        else
            System.out.println("Invalid");
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i;
        long data[] = new long[n];
        for(i = 0; i < n; i++)
            data[i] = input.nextLong();
        for(i = 0; i < n; i++)
            check(data[i]);
    }
}

 

 

 

반응형

댓글