문제:

올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘 했는지 결정한다.

1. 금메달 수가 더 많은 나라
2. 금메달 수가 같으면, 은메달 수가 더 많은 나라
3. 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라

각 국가는 1부터 N 사이의 정수로 표현한다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다.

각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오.

입력:

입력의 첫 줄은 국가의 수 N(1<=N<=1,000)과 등수를 알고 싶은 국가 K(1<=K<=N)가 빈칸을 사이에 두고 주어진다. 각 국가는 1부터 N 사이의 정수로 표현된다. 이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다. 전체 메달 수의 총합은 1,000,000 이하이다.

출력:

출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다. 등수는 반드시 문제에서 정의된 방식을 따라야 한다.

풀이 방법:

입력을 받는 값을 다 유지를 해야 하고, 금메달 > 은메달 > 동메달 가중치 순으로 정렬을 해줘야 한다. 정렬을 하기 전에 원하는 나라의 정보를 미리 temp에 저장을 해둔다. 가중치에 따라 정렬을 하고 temp에 저장해둔 금메달, 은메달, 동메달과 같은 값을 찾을 때까지(공동 순위가 존재하므로 꼭 temp의 나라가 아니라도 괜찮다.) count를 증가시킨다. 이후 같은 값을 만나면 count를 출력하고 종료한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
a,b=map(int,input().split())
countries=[]
for i in range(a):
    check=list(map(int,input().split()))
    if check[0]==b:
        temp=check
    countries.append(check)
countries.sort(key=lambda x: (x[1],x[2],x[3]),reverse=True)
count=0
for i in countries:
    count+=1
    if i[1]<=temp[1and i[2]<=temp[2and i[3]<=temp[3]:
        print(count)
        break
cs


'Algorithm > Python' 카테고리의 다른 글

[BOJ]11866. 조세퍼스 문제0  (0) 2019.05.07
[Programmers]Lv 3.디스크 컨트롤러  (2) 2019.05.06
[BOJ]1076. 저항  (0) 2019.05.04
[BOJ]1977. 완전제곱수  (0) 2019.05.03
[BOJ]1037. 약수  (0) 2019.05.02

문제:

전자 제품에는 저항이 들어간다. 저항은 색 3개를 이용해서 그 저항이 몇 옴인지 나타낸다.
처음 색 2개는 저항의 값이고, 마지막 색은 곱해야 하는 값이다.
저항의 값은 다음 표를 이용해서 구한다.

 색

값 

곱 

black 

brown 

10 

red 

100 

orange 

1000 

yellow 

10000 

green 

100000 

blue 

1000000 

violet 

10000000 

grey 

100000000 

white                                                        9                                                              1000000000


예를 들어, 저항에 색이 yellow, violet, red였다면 저항의 값은 4,700이 된다.


입력:

첫째 줄에 첫 번째 색, 둘째 줄에 두 번째 색, 셋째 줄에 세 번째 색이 주어진다. 색은 모두 위의 표에 쓰여 있는 색만 주어진다.


출력:

입력으로 주어진 저항의 저항값을 계산하여 첫째 줄에 출력한다.

풀이 방법:

항상 세 개의 명령을 받기 때문에 하나의 명령어 함수를 만들고 마지막 명령어일때에만 따로 구분을 두어서 곱하도록 만든다.
따라서 register라는 전역변수를 만든 후에 첫 번째, 두 번째 명령어일 때 이 값에 더해준다.

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
first=input()
second=input()
third=input()
register=''
def regis(first,last=True):
    global register
    if last==True:
        if first=="black":
            register+='0'
        elif first=="brown":
            register+='1'
        elif first=="red":
            register+='2'
        elif first=="orange":
            register+='3'
        elif first=="yellow":
            register+='4'
        elif first=="green":
            register+='5'
        elif first=="blue":
            register+='6'
        elif first=="violet":
            register+='7'
        elif first=="grey":
            register+='8'
        elif first=="white":
            register+='9'
    else:
        register=int(register)
        if first=="black":
            register*=1
        elif first=="brown":
            register*=10
        elif first=="red":
            register*=100
        elif first=="orange":
            register*=1000
        elif first=="yellow":
            register*=10000
        elif first=="green":
            register*=100000
        elif first=="blue":
            register*=1000000
        elif first=="violet":
            register*=10000000
        elif first=="grey":
            register*=100000000
        elif first=="white":
            register*=1000000000
        print(register)
regis(first)
regis(second)
regis(third,False)
cs


'Algorithm > Python' 카테고리의 다른 글

[Programmers]Lv 3.디스크 컨트롤러  (2) 2019.05.06
[BOJ]8979. 올림픽  (0) 2019.05.05
[BOJ]1977. 완전제곱수  (0) 2019.05.03
[BOJ]1037. 약수  (0) 2019.05.02
[BOJ]2156. 포도주 시식  (0) 2019.05.01

문제:

M과 N이 주어질 때 M이상 N이하의 자연수 중 완전제곱수인 것을 모두 골라 그 합을 구하고 그 중 최솟값을 찾는 프로그램을 작성하시오. 예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 완전제곱수는 64, 81, 100 이렇게 총 3개가 있으므로 그 합은 245가 되고 이 중 최솟값은 64가 된다.

입력:

첫째 줄에 M이, 둘째 줄에 N이 주어진다. M과 N은 10,000이하의 자연수이며 M은 N보다 같거나 작다.

출력:

M이상 N이하의 자연수 중 완전제곱수인 겻을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 완전제곱수가 없을 경우는 첫째 줄에 -1을 출력한다.

풀이 방법:

math의 sqrt를 사용해서 풀어야 하는 문제이다. 첫 숫자 M의 sqrt를 구한 후 floor함수를 써서 lower_bound 값을 구하고, N에 sqrt를 구한 후 ceil 함수를 써서 upper_bound를 구한다. 이 구간을 반복문을 돌리면서 합을 구한 뒤에 더해진 answer 값이 없다면 -1을 출력하고 더해진 값이 있다면 upper_bound의 제곱수 값을 출력다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import math
lower=int(input())
upper=int(input())
lower_bound=int(math.ceil(math.sqrt(lower)))
upper_bound=int(math.floor(math.sqrt(upper)))
answer=0
for i in range(lower_bound,upper_bound+1):
    answer+=i*i
if answer!=0:
    print(answer)
    print(lower_bound*lower_bound)
else:
    print(-1)
cs


'Algorithm > Python' 카테고리의 다른 글

[BOJ]8979. 올림픽  (0) 2019.05.05
[BOJ]1076. 저항  (0) 2019.05.04
[BOJ]1037. 약수  (0) 2019.05.02
[BOJ]2156. 포도주 시식  (0) 2019.05.01
[BOJ]2193. 이친수  (0) 2019.04.30

문제:

양수 A가 N의 진짜 약수가 되려면, N이 A의 배수이고, A가 1과 N이 아니어야 한다. 어떤 수 N의 진짜 약수가 모두 주어질 때, N을 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되지 않는다.

출력:

첫째 줄에 N을 출력한다. N은 항상 32비트 부호있는 정수로 표현할 수 있다.

풀이 방법:

진짜 약수는 1과 N을 포함하고 있지 않으므로 진짜 약수들을 정렬한 뒤에 가장 첫값과 가장 마지막 값을 곱한 값이 N이 될 것이다. 

1
2
3
a=int(input())
answer=sorted(list(map(int,input().split())))
print(answer[0]*answer[-1])
cs


'Algorithm > Python' 카테고리의 다른 글

[BOJ]1076. 저항  (0) 2019.05.04
[BOJ]1977. 완전제곱수  (0) 2019.05.03
[BOJ]2156. 포도주 시식  (0) 2019.05.01
[BOJ]2193. 이친수  (0) 2019.04.30
[BOJ]1003. 피보나치 함수  (0) 2019.04.26

문제:

정화는 NxM 크기의 초콜릿을 하나 가지고 있다. 초콜릿은 금이 가 있는 모양을 하고 있으며, 그금에 의해 NxM개의 조각으로 나눠질 수 있다.

초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다. 이를 위해서 정화는 초콜릿을 계속 쪼개서 총 NxM개의 조각으로 쪼개려고 한다. 초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다. 초콜릿을 초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다. 이와 같이 초콜릿을 쪼개면 초콜릿은 두 개의 조각으로 나눠지게 된다. 이제 다시 이 중에서 초콜릿 조각을 하나 들고, 쪼개는 과정을 반복하면 된다.

초콜릿을 쪼개다보면 초콜릿이 녹을 수 있기 때문에, 정화는 가급적이면 초콜릿을 쪼개는 횟루를 최소로 하려 한다. 초콜릿의 크기가 주어졌을 때, 이를 1x1 크기의 초콜릿으로 쪼개기 위한 최소 쪼개기 횟수를 구하는 프로그램을 작성하시오.


입력:

첫째 줄에 두 정수 N,M(1<=N,M<=300)이 주어진다.

출력:

첫째 줄에 답을 출력한다.

풀이 방법:

원래 동적계획법을 사용해서 풀어야 하는 문제인데, 굳이 동적계획법을 사용할 필요는 없다. 단순한 사칙연산만으로도 쉽게 구할 수 있다.

1
2
a,b=map(int,input().split())
print(min(a,b)*(max(a,b)-1)+min(a,b)-1)
cs


'Algorithm > Python' 카테고리의 다른 글

[BOJ]10844. 쉬운 계단 수  (0) 2019.04.22
[BOJ]1149. RGB거리  (0) 2019.04.21
[BOJ]1912. 연속합  (0) 2019.04.19
[BOJ]2504. 괄호의 값  (0) 2019.04.18
[BOJ]9012.괄호  (0) 2019.04.17

문제:

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6=8이다. 새로운 수는 68이다. 6+8=14이다. 새로운 수는 84이다. 8+4=12이다. 새로운 수는 42이다. 4+2=6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N이 사이클의 길이를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고,99보다 작서나 같은 정수이다.

출력:

첫째 줄에 N의 사이클 길이를 출력한다.

풀이 방법:

첫번째 진행단계만 진행시켜준 뒤로 while문에 넣어서 다시 돌아올 때까지 계속 반복시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def cycle(n):
    answer=1
    n1 = n
    if n < 10:
        n = 10*n+n
    else:
        new_number1=n%10
        new_number2=n//10+n%10
        n=10*new_number1+new_number2%10
    while n1 != n:
        answer += 1
        if n < 10:
            n = 10*n+n
        else:
            new_number1=n%10
            new_number2=n//10+n%10
            n=10*new_number1+new_number2%10
    return answer
n=input()
n=int(n)
print(cycle(n))
cs


'Algorithm > Python' 카테고리의 다른 글

[BOJ]1152. 단어의 개수  (0) 2019.04.04
[BOJ]1065. 한수  (0) 2019.04.03
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]2839.설탕 배달  (1) 2019.03.31
[BOJ]11718.그대로 출력하기  (0) 2019.03.30

문제:

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

주의 사항:

정확하게 만들 수 없다면 -1을 출력한다.

풀이 방법:

while문을 사용해서 무게가 3인 봉지를 하나씩 늘리면서 필요한 무게가 5인 봉지의 수를 구하고, 다시 한 번 무게가 5인 봉지를 하나씩 늘리면서, 필요한 무게가 3인 봉지의 개수를 찾는다. 정확히 N킬로그램이 되는 경우만 배열에 넣는다. while문이 끝나고 배열의 길이가 1보다 크다면 그 중 가장 작은 값을 반환하고, 그렇지 않으면 -1을 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def sugar(n):
    x=1
    count=[]
    while n//(3*x) > 0:
        if (n-3*x)%5 == 0:
            y= (n-3*x)//5
            count.append(x+y)
        x+=1
    y=1
    while n//(5*y) > 0:
        if (n-5*y)%3 == 0:
            x= (n-5*y)//3
            count.append(x+y)
        y+=1    
    if len(count)==0:
        return -1
    else:
        return min(count)
n=int(input())
print(sugar(n))
cs


'Algorithm > Python' 카테고리의 다른 글

[BOJ]1110. 더하기 사이클  (0) 2019.04.02
[BOJ]4344. 평균은 넘겠지  (0) 2019.04.01
[BOJ]11718.그대로 출력하기  (0) 2019.03.30
[Programmers]Lv 2. 라면공장  (0) 2019.03.29
[Programmers]Lv 2. 영어 끝말잇기  (0) 2019.03.28

+ Recent posts