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

Chapter 7. Single-Dimensional Arrays[Java Basic]

by sonpang 2021. 11. 5.
반응형

7.A - 성적 주기

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

학생들의 점수를 입력받아서 최고점을 찾아내고, 이를 토대로 학생들의 성적을 결정해주는 프로그램을 작성하세요. 규칙은 다음과 같습니다.

성적이 최고점-10 이상이면 A

성적이 최고점-20 이상이면 B

성적이 최고점-30 이상이면 C

성적이 최고점-40 이상이면 D

그외는 F

Write a program that reads student scores, gets the best score, and then assigns grades based on the following scheme:

 

Grade is A if score is ≥ best - 10

Grade is B if score is ≥ best - 20

Grade is C if score is ≥ best - 30

Grade is D if score is ≥ best - 40

Grade is F otherwise.

The program prompts the user to enter the total number of students, then prompts the user to enter all of the scores, and concludes by displaying the grades.

 

INPUT

* Line 1 : 학생의 수 N (1~100)

* Line 2 ~ N+1 : 실수형태의 학생의 성적 (0~100)

 

OUTPUT

* Line 1 ~ T : 학생의 성적

 

SAMPLE INPUT

4

40

55

70

58

 

SAMPLE OUTPUT

C

B

A

B

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i, max = 0;
        int data[] = new int[n];
        for(i = 0; i < n; i++)
            if(max < (data[i] = input.nextInt()))
                max = data[i];
        for(i = 0; i < n; i++){
            if(max - data[i] <= 10)
                System.out.println("A");
            else if(max - data[i] <= 20)
                System.out.println("B");
            else if(max - data[i] <= 30)
                System.out.println("C");
            else if(max - data[i] <= 40)
                System.out.println("D");
            else
                System.out.println("F");
        }
    }
}

 

 

7.B - 숫자빈도

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

-100부터 100사이의 정수들을 입력받아 각 숫자별로 몇번 나타났는지 오름차순으로 개수를 출력하는 프로그램을 만드세요.

Write a program that reads the integers between -100 and 100 and counts the occurrences of each with ascending order.

 

INPUT

* Line 1 : 숫자의 개수 N (1~10,000)

* Line 2 ~ N+1 : 정수 (-100~100)

 

OUTPUT

* Line 1 ~ M :공백으로 구분하여 정수와 개수를 출력

- M은 중복되지 않은 정수의 개수

 

SAMPLE INPUT

5

-3

100

-1

-2

-1

 

SAMPLE OUTPUT

-3 1

-2 1

-1 2

100 1

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), i;
        int data[] = new int[n], count[] = new int[201];
        for(i = 0; i < n; i++)
            count[data[i] = input.nextInt() + 100]++;
        for(i = 0; i < 201; i++)
            if(count[i] > 0)System.out.println(i - 100 + " " + count[i]);
    }
}

 

 

7.C - 게임: 콩기계

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

Quincunx 또는 Galton box로 알려져 있는 콩기계는 영국의 과학자 Sir Francis Galton의 이름을 따서 만들어진 장치이다. 콩기계는 수직으로 세워진 판위에 나무못이 삼각형의 형태로 균등하게 고정되어 있다.

The bean machine, also known as a quincunx or the Galton box, is a device for statistics experiments named after English scientist Sir Francis Galton. It consists of an upright board with evenly spaced nails (or pegs) in a triangular form, as shown in Figure 7.13.

콩기계 상단의 입구에 떨어진 공은 중력에 의해서 떨어지는데, 나무못에 부딪칠 때마다 50%의 확률로 왼쪽 또는 오른쪽으로 방향을 전환한다. 기계 하단에는 떨어진 콩을 담기위한 슬롯이 있으며, 떨어진 콩은 슬롯에 쌓이게 된다. 예를 들어, Figure 7.13b에서 공의 경로는 LLRRLLR 이고 Figure 7.13c에서 공의 경로는 RLRRLRR이다. 여러분은 볼을 떨어 뜨린 횟수 N과 슬롯의 개수 M 그리고 떨어지는 공의 경로를 입력으로 받아, 최종적으로 오름차순으로 슬롯에 몇개의 콩이 들어 있는지 출력하는 프로그램을 작성해야 한다.

Balls are dropped from the opening of the board. Every time a ball hits a nail, it has a 50% chance of falling to the left or to the right. The piles of balls are accumulated in the slots at the bottom of the board. Write a program that simulates the bean machine. Your program should prompt the user to enter the number N of the balls and the number M of the slots in the machine, and the falling path of each ball, then display the final buildup of the balls in the slots in a histogram. For example, the path for the ball in Figure 7.13b is LLRRLLR and the path for the ball in Figure 7.13c is RLRRLRR.

 

INPUT

* Line 1 : 볼을 떨어 뜨린 횟수 N (1~100)

* Line 2 : 슬롯의 개수 M (2~100)

* Line 3 ~ N+2 : 경로를 나타내는 M-1길이의 문자열

 

OUTPUT

* Line 1 ~ M : 슬롯에 들어 있는 볼의 개수

 

 

SAMPLE INPUT

5

8

LRLRLRR

RRLLLRR

LLRLLRR

RRLLLLL

LRLRRLR

 

SAMPLE OUTPUT

0

0

1

1

3

0

0

0

 

HINT

Create an array named slots. Each element in slots stores the number of balls in a slot. Each ball falls into a slot via a path. The number of Rs in a path is the position of the slot where the ball falls. For example, for the path LRLRLRR, the ball falls into slots[4], and for the path is RRLLLLL, the ball falls into slots[2]

 

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt(), m = input.nextInt(), i, j, count[] = new int[m], cl;
        input.nextLine();
        String path;
        for(i = 0; i < n; i++){
            path = input.nextLine();
            cl = 0;
            for(j = 0; j < path.length(); j++){
                if(path.charAt(j) == 'R')
                    cl++;
            }
            count[cl]++;
        }
        for(i = 0; i < m; i++)
            System.out.println(count[i]);
    }
}

 

7.D - 게임: 8퀸

Time Limit: 1s Memory Limit: 128MB

DESCRIPTION

전통적인 8퀸 퍼즐은 체스판에서 8명의 퀸이 서로 공격 못하게(동일 행, 동일 칼럼, 동일 대각선 상에 있는 퀸은 서로 공격할 수 있다) 배치하는 문제이다. 8퀸을 배치하는 가지수는 많이 존재한다. 여러분은 주어진 체스판에 8명의 퀸이 타당하게 배치되어 있는지 판단하는 프로그램을 작성해야 한다

The classic Eight Queens puzzle is to place eight queens on a chessboard such that no two queens can attack each other (i.e., no two queens are on the same row, same column, or same diagonal). There are many possible solutions. Write a program that check valid solution of Eight Queens puzzle.

INPUT

* Line 1 ~ 8 : 퀸은 Q 빈칸은 . 으로 표시된 행

 

 

OUTPUT

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

 

SAMPLE INPUT

Q.......

....Q...

.......Q

.....Q..

..Q.....

......Q.

.Q......

...Q....

 

SAMPLE OUTPUT

Valid

 

import java.util.Scanner;
public class Main {
    private static boolean check(int c[][], int x, int y){
        int i, j;
        for(j = 0; j < y; j++)
            if(c[x][j] == 1 && j != y)
                return false;
        for(i = x, j = y; i >= 0 && j >= 0; i--, j--)
            if(c[i][j] == 1 && i != x)
                return false;
        for(i = x, j = y; i >= 0 && j < 8; i--, j++)
            if(c[i][j] == 1 && i != x)
                return false;
        for(i = x, j = y; i < 8 && j >= 0; i++, j--)
            if(c[i][j] == 1 && i != x)
                return false;
        return true;
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int count[][] = new int[8][8], i, j;
        String data[] = new String[8];
        for(i = 0; i < 8; i++)
            data[i] = input.nextLine();
        for(i = 0; i < 8; i++){
            for(j = 0; j < 8; j++){
                if(data[i].charAt(j) == 'Q'){
                    if(check(count,i,j))
                        count[i][j]++;
                    else{
                        System.out.println("Invalid");
                        return;
                    }
                }
            }
        }
        System.out.println("Valid");
    }
}
반응형

 

7.E - 게임: N퀸 (난이도:고급)

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

전통적인 8퀸 퍼즐은 체스판에서 8명의 퀸이 서로 공격 못하게(동일 행, 동일 칼럼, 동일 대각선 상에 있는 퀸은 서로 공격할 수 있다) 배치하는 문제이다. 이 문제를 확장해서 NxN 체스판에 N개의 퀸이 서로 공격 못하게 배치하는 문제를 N퀸 퍼즐이라고 한다. 여러분은 NxN 체스판에서 N개의 퀸이 서로 공격 못하게 배치할 수 있는 모든 가지수를 계산하는 프로그램을 작성해야 한다.

 

INPUT

* Line 1 : N을 나타내는 정수 (1 ≤ N < 11)

 

OUTPUT

* Line 1 : N개의 퀸을 서로 공격 못하게 배치하는 경우의 수

 

SAMPLE INPUT

8

SAMPLE OUTPUT

92

 

import java.util.Scanner;
public class Main {
    static int m = 0;
    private static boolean check(int c[][], int x, int y, int n){
        int i, j;
        for(j = 0; j < y; j++)
            if(c[x][j] == 1 && j != y)
                return false;
        for(i = x, j = y; i >= 0 && j >= 0; i--, j--)
            if(c[i][j] == 1 && i != x)
                return false;
        for(i = x, j = y; i >= 0 && j < n; i--, j++)
            if(c[i][j] == 1 && i != x)
                return false;
        for(i = x, j = y; i < n && j >= 0; i++, j--)
            if(c[i][j] == 1 && i != x)
                return false;
        return true;
    }
    static void swap(int arr[], int d, int i){
        int temp = arr[d];
        arr[d] = arr[i];
        arr[i] = temp;
    }
    private static boolean count(int data[][], int n){
        int i, j;
        for(i = 0; i < n; i++){
            for(j = 0; j < n; j++){
                if(data[i][j] == 1){
                    if(!check(data, i, j, n))
                        return false;
                }
            }
        }
        return true;
    }
    private static void set(int arr[], int d, int n){
        if(d == n){
            int data[][] = new int[n][n];
            for(int i = 0; i < n; i++)
                data[i][arr[i]] = 1;
            if(count(data, n))
                m++;
            return;
        }
        for(int i = d; i < n; i++){
            swap(arr, d, i);
            set(arr, d + 1, n);
            swap(arr, d, i);
        }
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int count[][] = new int[n][n], i, j, arr[] = new int[n];
        for(i = 0; i < n; i++)
            arr[i] = i;
        set(arr, 0, n);
        System.out.println(m);
    }
}

 

 

7.F - 게임: 사물함 퍼즐1

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

100명의 학생과 100개의 사물함이 있다. 모든 사물함은 초기에 닫혀있다. 첫번째 학생은 1번째 사물함부터 1의 배수인 사물함의 상태를 바꾼다(닫혀있으면 열고 열려있으면 닫고) 두번째 학생은 2번째 사물함부터 2의 배수인 사물함의 상태를 바꾼다. 3,4,5번째 학생도 똑같이 자기 배수의 사물함의 상태를 바꾼다. 100번째학생이 100번째 사물함의 상태를 변경할 때까지 진행된다.

A school has 100 lockers and 100 students. All lockers are closed on the first day of school. As the students enter, the first student, denoted S1, opens every locker. Then the second student, S2, begins with the second locker, denoted L2, and closes every other locker. Student S3 begins with the third locker and changes every third locker (closes it if it was open, and opens it if it was closed). Student S4 begins with locker L4 and changes every fourth locker. Student S5 starts with L5 and changes every fifth locker, and so on, until student S100 changes L100.

 

모든 학생이 해당 놀이를 하면서 학교에 들어갔다고 했을때, 어떤 사물함이 열려 있고 닫혀있는지 찾아내는 프로그램을 작성해보자.

After all the students have passed through the building and changed the lockers, which lockers are open? Write a program to find your answer.

 

INPUT

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

* Line 2 ~ T+1 : 열려 있는지 확인할 사물함 번호 (1~100)

 

OUTPUT

* Line 1 ~ T : 열려있으면 open을 닫혀있으면 close를 출력

 

SAMPLE INPUT

3

2

10

100

 

SAMPLE OUTPUT

close

close

open

 

HINT

Use an array of 100 Boolean elements, each of which indicates whether a locker is open (true) or closed (false). Initially, all lockers are closed.

 

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, data[] = new int[n];
        boolean b[] = new boolean[101];
        for(i = 1; i <= 100; i++){
            j = 0;
            while((j += i) <= 100)
                b[j] = !b[j];
        }
        for(i = 0; i < n; i++)
            data[i] = input.nextInt();
        for(i = 0; i < n; i++)
            System.out.println(b[data[i]] ? "open" : "close");
    }
}

 

 

7.G - 게임: 사물함 퍼즐2 (난이도:고급)

Time Limit: 1s Memory Limit: 128MB

 

DESCRIPTION

n명의 학생과 n명의 사물함이 있다. 모든 사물함은 초기에 닫혀있다. 첫번째 학생은 1번째 사물함부터 1의 배수인 사물함의 상태를 바꾼다(닫혀있으면 열고 열려있으면 닫고) 두번째 학생은 2번째 사물함부터 2의 배수인 사물함의 상태를 바꾼다. 3,4,5번째 학생도 똑같이 자기 배수의 사물함의 상태를 바꾼다. n번째학생이 n번째 사물함의 상태를 바꿀때까지 계속된다!

A school has n lockers and n students. All lockers are closed on the first day of school. As the students enter, the first student, denoted S1, opens every locker. Then the second student, S2, begins with the second locker, denoted L2, and closes every other locker. Student S3 begins with the third locker and changes every third locker (closes it if it was open, and opens it if it was closed). Student S4 begins with locker L4 and changes every fourth locker. Student S5 starts with L5 and changes every fifth locker, and so on, until student Sn changes Ln.

 

모든 학생이 해당 놀이를 하면서 학교에 들어갔다고 했을때, 어떤 사물함이 열려 있고 닫혀있는지 찾아내는 프로그램을 작성해보자.

After all the students have passed through the building and changed the lockers, which lockers are open? Write a program to find your answer.

 

INPUT

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

* Line 2 ~ T+1 : n i

- n: 학생수 (1~100,000)

- i : 열려 있는지 확인할 사물함 번호 (1~n)

 

OUTPUT

* Line 1 ~ T : 열려있으면 open을 닫혀있으면 close를 출력

 

SAMPLE INPUT

3

10 2

1000 99

10000 998

 

SAMPLE OUTPUT

close

close

close

 

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, data[][] = new int[n][3];
        for(i = 0; i < n; i++){
            data[i][0] = input.nextInt();
            data[i][1] = input.nextInt();
            for(j = 1; j < data[i][1]; j++)
                if(data[i][1] % j == 0)
                    data[i][2]++;
        }
        for(i = 0; i < n; i++)
            System.out.println(data[i][2] % 2 == 0 ? "open" : "close");
    }
}

 

 

반응형

댓글