문제

 

모바일 게임을 즐겨 하는 지우는 Jetpack Joyride 에 금새 질렸고 포켓몬 GO를 시작했다! 이 게임의 재미있는 점은 포켓몬을 진화시킬 수 있다는 것이다.

지우가 Pi 라는 포켓몬을 진화시키기 위해서는 해당 포켓몬의 Ki 개의 사탕이 필요하다. 진화가 된 후에는 2개의 사탕을 돌려받는다.

각 포켓몬은 그들 종의 사탕으로만 진화할 수 있다.

지우는 N종의 포켓몬이 있고 Pi 라는 포켓몬의 사탕은 Mi 개를 가지고 있으며 지우는 진화시킬 수 있는 포켓몬의 총 마리수를 궁금해한다.

또한, 지우는 가장 많이 진화시킬 수 있는 포켓몬이 무엇인지 알고 싶어한다. 만약 그런 포켓몬들이 여러 종이 있다면 도감번호가 가장 작은 포켓몬을 출력한다. 즉, 입력 데이터에서 더 먼저 나타나는 포켓몬을 출력하면 된다. 

 

입력

첫 번째 줄에는 포켓몬의 종류 수를 나타내는 N (1 ≤ N ≤ 70)이 주어진다.

그 다음 2N 줄에는 N개의 데이터 세트가 입력되는데

  • 2i 번째 줄에는 i번째 포켓몬의 이름을 나타내는 최대길이 20의 Pi 문자열이 주어진다.
  • 2i + 1 번째 줄에는 Ki  (12 ≤ Ki ≤ 400) , Mi (1 ≤ Mi ≤ 104) 가 주어지는데 각각 i 번째 포켓몬이 진화에 필요한 사탕의 수와 지우가 가지고 있는 i 번째 포켓몬의 총 사탕의 수이다.

 

출력

첫 번째 줄엔 진화시킬 수 있는 포켓몬의 총 마리수를 출력한다.

두 번째 줄엔 가장 많이 진화시킬 수 있는 포켓몬의 이름을 출력한다.

 

조건

시간 제한: 1초

메모리 제한: 32MB

 

코드 (Java 11)
import java.util.Scanner;

public class Main
{
    public static void main(String args[])
    {
        Scanner scanner = new Scanner(System.in);
        
        int test=scanner.nextInt(), index=0, result=0, max=-1;
        Pokemon pokemon[]=new Pokemon[test];
        
        for(int t=0;t<test;t++)
        {
            String name=scanner.next();
            int need=scanner.nextInt(), hava=scanner.nextInt();

            pokemon[t]=new Pokemon(name, need, hava);
            int evolution=pokemon[t].get_evolution();

            if(max<evolution)
            {
                index=t;
                max=evolution;
            }
            result+=evolution;
        }
        
        System.out.println(result);
        System.out.println(pokemon[index].name);

        scanner.close();
    }
}

class Pokemon
{
    String name;
    int candy_need, candy_have;

    public Pokemon(String name, int candy_need, int candy_have)
    {
        this.name=name;
        this.candy_need=candy_need;
        this.candy_have=candy_have;
    }
    public int get_evolution()
    {
        int evolution=0;

        while(candy_have>=candy_need)
        {
            candy_have-=candy_need;
            evolution++;
            candy_have+=2;
        }
        return evolution;
    }
}
문제

N*M크기의 행렬 A와 M*K크기의 행렬 B가 주어졌을 때, 두 행렬을 곱하는 프로그램을 작성하시오.

 

 

조건 및 입출력

1. 첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개가 차례대로 주어진다. N과 M, 그리고 K는 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.

2. 첫째 줄부터 N개의 줄에 행렬 A와 B를 곱한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.

3. 시간 제한: 1초 / 메모리 제한: 128MB

 

 

코드 (Java 11)
import java.util.Scanner;

public class Main
{
    public static void main(String[] args) 
    {
        Scanner scanner = new Scanner(System.in);

        int row_A=scanner.nextInt();
        int col_A=scanner.nextInt();
        int martrix_A[][]=new int[row_A][col_A];

        for(int i=0;i<row_A;i++)
        {
            for(int j=0;j<col_A;j++)
            {
                martrix_A[i][j]=scanner.nextInt();
            }
        }
        
        int row_B=scanner.nextInt();
        int col_B=scanner.nextInt();
        int martrix_B[][]=new int[row_B][col_B];

        for(int i=0;i<row_B;i++)
        {
            for(int j=0;j<col_B;j++)
            {
                martrix_B[i][j]=scanner.nextInt();
            }
        }

        for(int i=0;i<row_A;i++)
        {
            for(int j=0;j<col_B;j++)
            {
                long result=0;
                for(int k=0;k<col_A;k++)
                {
                    result+=martrix_A[i][k]*martrix_B[k][j];
                }
                System.out.printf("%d ",result);
            }
            System.out.printf("\n");
        }
        scanner.close();
    }
}
문제

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다.

이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다.

예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 버린 카드들은 순서대로 1 3 2가 되고, 남는 카드는 4가 된다.

N이 주어졌을 때, 버린 카드들을 순서대로 출력하고, 마지막에 남게 되는 카드를 출력하는 프로그램을 작성하시오.

 

 

조건 및 입출력

1. 첫째 줄에 정수 N(1 ≤ N ≤ 1,000)이 주어진다.

2. 첫째 줄에 버리는 카드들을 순서대로 출력한다. 제일 마지막에는 남게 되는 카드의 번호를 출력한다.

3. 시간 제한: 2초 / 메모리 제한: 128MB

 

 

코드 (Python3)
card=[i for i in range(1,int(input())+1)];

while(len(card)!=1):
    print(card.pop(0),end=' ');
    card.append(card.pop(0));

print(card[0]);

 

문제

이번 중간고사에는 총 N문제가 나왔고, 응시한 사람의 수는 M명이다. 각 문제의 배점과 각 사람의 결과가 주어졌을 때, 가장 높은 점수를 획득한 사람을 구하는 프로그램을 작성하시오.

 

 

조건 및 입출력

- 첫째 줄에 문제의 개수 N과 응시자의 수 M이 주어진다. (1 ≤ N ≤ 100, 1 ≤ M ≤ 100)

둘째 줄에는 문제의 배점이 1번 문제부터 N번 문제까지 순서대로 주어진다. 각 문제의 배점은 100보다 작거나 같은 자연수이며, 공백으로 구분되어져 있다.

셋째 줄부터 M개의 줄에는 응시자의 정보가 한 줄에 하나씩 주어진다. 응시자의 정보는 총 N+1개의 문자열로 이루어져 있다. 첫 번째 문자열은 응시자의 수험 번호이다. 수험 번호는 100,000보다 작거나 같은 자연수이다. 두 번째 부터 N+1번째 문자열은 각 시험 문제의 채점 결과이다. 채점 결과는 1번 문제부터 N번 문제까지 순서대로 주어지며, 'O' 또는 'X'이다. 'O'가 주어진 경우에는 해당 문제를 맞춘 것이고, 'X'가 주어진 경우에는 해당 문제를 틀린 것이다.

문제를 맞춘 경우에는 그 문제의 배점이 점수에 더해지게 되며, 틀린 경우에는 더해지지 않는다. 수험 번호가 중복되는 경우는 없다.

- 첫째 줄에 가장 높은 점수를 얻은 학생의 번호와 점수를 공백으로 구분해 출력한다. 만약, 가장 높은 점수를 얻은 학생이 여러 명이라면, 수험 번호가 가장 작은 것을 출력한다.

- 시간 제한: 1초 / 메모리 제한: 512MB

 

 

코드 (Python 3)
import sys
input=sys.stdin.readline;

question,students=map(int,input().split());
credit=list(map(int,input().split()));
result=dict();

for i in range(students):
    cmd=list(input().rstrip().split());
    id=cmd[0]; omr=cmd[1::];

    if(id not in result):
        result[id]=0;
    
    score=0;

    for j in range(question):
        if(omr[j]=='O'):
            score+=credit[j];

    result[id]=score;

result=sorted(result.items(),key=lambda x:(-x[1],int(x[0])));
print(*result[0]);
문제

천나라 민호성의 지영 공주님은 매우 아름답다. 공주님 자신도 이 세상 그 누구보다 자신이 아름답다는 것을 알고 있다. 공주님은 자신의 아름다움이 세월의 저편으로 사라지는 것을 매우 두려워한다. 그래서 하루에도 수십 수백 번씩 거울을 보며 자신의 모습이 여전히 아름다운지 확인을 거듭한다. 그러던 어느 날, 세상의 다양한 장면들을 담고 싶었던 공주님의 마법거울은 매일 똑같은 모습만을 비추는 자신의 운명에 좌절하며 앞으로의 운명을 개척하기로 결심했다. 마법거울은 매일 자신의 심리상태에 따라 거울에 비친 공주님의 모습을 좌/우 또는 상/하로 반전시켜 비추기로 한다. 마법거울의 심리상태는 1부터 3까지의 자연수로 표현할 수 있으며, 숫자가 클수록 더 화가 난 상태를 의미한다. 마법거울의 심리상태가 1일 때는 지영 공주님의 모습을 있는 그대로 표현하고, 2일 때는 좌/우로 반전된 모습을, 3일 때는 상/하로 반전된 모습을 표현한다. 정사각형 형태의 마법거울의 크기와 거울에 비친 지영 공주님의 원래 모습, 마법거울의 심리상태가 주어졌을 때, 마법거울에 비친 지영 공주님의 모습을 출력하라.

 

 

조건 및 입출력

- 첫 번째 줄에 정사각형 모양의 마법거울의 크기를 나타내는 자연수 N(2 ≤ N ≤ 100)이 입력된다. 그 다음 N개의 줄에 걸쳐 거울에 비친 지영 공주님의 원래 모습이 각 줄에 N개의 문자로 표현된다. 마법거울은 알파벳 대소문자로만 거울에 비친 상을 표현할 수 있다. 마지막 줄에 마법거울의 심리상태를 나타내는 정수 K(1 ≤ K ≤ 3)가 주어진다.

- 마법거울의 심리상태에 따라 거울에 비친 지영공주님의 모습을 N×N크기의 정사각형 형태로 출력하라. 반전된 모습은 입력으로 주어진 문자의 위치를 반전시키는 것을 의미한다.

- 시간 제한: 2초 / 메모리 제한: 256MB

 

 

코드(Python 3)
test=int(input());
face=[];

for i in range(test):
    face.append(list(input()));

command=int(input());

if(command==1):
    for i in face:
        print(''.join(i));
elif(command==2):
    for i in face:
        print(''.join(i[::-1]));
else:
    while(len(face)>0):
        print(''.join(face.pop(-1)));

+ Recent posts