728x90
반응형

문제:

자연수 N과 정수 K가 주어졌을 때 이항 계수 (N K) 를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N과 K가 주어진다. (1<= N <=10, 0<=K <=N)

출력:

(N K)를 출력한다.

풀이 방법:

이 문제는 이항 계수를 재귀함수로 구현을 해서 풀어야 하는 문제 였다. 파스칼의 법칙에 의해서 이항계수는 다음과 같은 공식을 가진다.

  C(n ,k) =C(n-1,k-1)+C(n-1,k)

따라서 이를 general case, 즉 크기가 감소되는 케이스로 분류를 한다. 또한 이항계수는 C(n,0) ,C(n,n)일 때 항상 1이라는 값을 가진다. 따라서 이 경우는 base case로 재귀가 끝나는 경우로 분류를 한다.


1
2
3
4
5
6
7
8
9
10
11
a,b=map(int,input().split())
 
def binomial(n,k):
    if n==k:
        return 1
    elif k==0:
        return 1
    else:
        return binomial(n-1,k-1)+binomial(n-1,k)
    
print(binomial(a,b))
cs


728x90
반응형

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

[BOJ]1676. 팩토리얼 0의 개수  (0) 2019.05.10
[BOJ]11051. 이항 계수 2  (0) 2019.05.09
[BOJ]11866. 조세퍼스 문제0  (0) 2019.05.07
[Programmers]Lv 3.디스크 컨트롤러  (2) 2019.05.06
[BOJ]8979. 올림픽  (0) 2019.05.05
728x90
반응형

관계 데이터 모델에서 지원하는 언어에는 크게 두 가지가 있다.

 

1. 관계 해석 - 원하는 데이터만 명시하고 질의를 어떻게 수행할 것인가는 명시하지 않는 선언적인 언어

 

2. 관계 대수 - 어떻게 질의를 수행할 것인가를 명시하는 절차적 언어, SQL의 이론적인 기초

 

관계 대수

기존의 릴레이션들로부터 새로운 릴레이션을 생성한다. 즉 입력값, 출력 값이 모두 릴레이션이다.

연산자들을 적용하여 보다 복잡한 관계 대수식을 점차적으로 만들 수 있음. 기본적인 연산자들의 집합으로 이루어짐.

결과 릴레이션은 또 다른 관계 연산자의 입력으로 사용될 수 있다.

 

관계 연산자들의 종류와 표기법

실렉션 연산자

σ<실렉션 조건>(릴레이션) 과 같이 사용하며 한 릴레이션에서 조건을 만족하는 투플들의 부분 집합을 생성한다.

단항 연산자이며 결과 릴레이션의 차수는 항상 입력 릴레이션의 차수와 같으며 카디날리티는 결과가 항상 작거나 같다.

 

실렉션 연산자 예시

프로젝션 연산자

π<애트리뷰트 리스트>(릴레이션) 과 같이 사용하며 한 릴레이션의 애트리뷰트들의 부분 집합을 구한다.

결과 릴레이션은 애트리뷰트 리스트에 명시된 애트리뷰트들만 가진다. 실렉션의 결과로는 중복 투플이 존재할 수 있지만 프로젝션의 결과에는 중복된 투플이 존재하지 않음

 

프로젝션 연산자 예시

집합 연산자

릴레이션이 투플들의 집합이기 때문에 기존의 집합 연산이 릴레이션에 적용된다. 집합 연산자에는 합집합, 교집합, 차집합이 있다. 집합 연산자의 입력으로 사용되는 두 개의 릴레이션은 합집합 호환이어야 한다.

 

*합집합 호환

두 릴레이션 R1(A1, A2,..., An)과 R2(B1, B2,... , Bm)이 합집합 호환일 필요충분조건은 n=m이고, 모든 1 <=i <=n에 대해 domain(Ai)=domain(Bi)이다.

 

합집합 연산자

릴레이션 1 ∪ 릴레이션 2와 같이 사용하며 릴레이션1에 있거나, 릴레이션2에 있는 투플들로 이루어진 릴레이션을 반환

결과 릴레이션에서는 중복된 투플들은 제거한다.

 

합집합 연산자 예시

교집합 연산자

릴레이션1 ∩ 릴레이션2 와 같이 사용하며 릴레이션 1, 릴레이션 2에 동시에 속하는 투플들로 이루어진 릴레이션

 

교집합 연산자 예시

차집합 연산자

릴레이션 R, S에 대해 차집합 R-S는 R에는 속하지만 S에는 속하지 않은 투플들로 이루어진 릴레이션

 

차집합 연산자 예시

728x90
반응형
728x90
반응형

문제:

조세퍼스 문제는 다음과 같다.

1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(<=N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N,K)-조세퍼스 순열이라고 한다. 예를 들어 (7,3)-조세퍼스 순열은 <3, 6, 2, 7, 5, 1, 4> 이다.

N과 K가 주어지면 (N, K)-조세퍼스 순열을 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1<=K<=N<=1,000)

출력:

예제와 같이 조세퍼스 순열을 출력한다.

풀이 방법:

 값을 빼기 전에 미리 idx를 저장을 해두는 것이 중요하다. 값을 먼저 빼버리면 다음 순환 반복을 못하기 때문이다. 또한 빼준 다음에는 idx 를 1 감소해서 인덱스가 하나 줄었음을 나타낸다. 또한 값을 뺄 당시에 출력 예시와 동일하게 만들어야 하므로 끝 값에만 따로 케이스를 분류를 해두었다.

이 문제는 태그가 큐로 되어 있었는데 아마도 순환 큐를 이용해서 풀어야 하는 문제인 것 같다.

1
2
3
4
5
6
7
8
9
10
11
12
a,b=map(int,input().split())
answer=list(range(1,a+1))
idx=-1
print("<",end="")
while(len(answer)!=0):
    idx+=b
    idx=idx%(len(answer))
    if len(answer)==1:
        print(answer.pop(idx),end=">")
    else:
        print(answer.pop(idx),end=", ")
    idx-=1
cs


728x90
반응형

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

[BOJ]11051. 이항 계수 2  (0) 2019.05.09
[BOJ]11050. 이항 계수 1  (0) 2019.05.08
[Programmers]Lv 3.디스크 컨트롤러  (2) 2019.05.06
[BOJ]8979. 올림픽  (0) 2019.05.05
[BOJ]1076. 저항  (0) 2019.05.04
728x90
반응형

문제:

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다.

예를 들어,
0ms 시점에 3ms가 소요되는 A작업 요청
1ms 시점에 9ms가 소요되는 B작업 요청
2ms 시점에 6ms가 소요되는 C작업 요청

과 같이 요청이 들어왔습니다. 한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다.

A: 3ms 시점에 작업 완료 (요청에서 종료까지 : 3ms)
B: 1ms부터 대기하다가, 3ms 시점에 작업을 시작해서 12ms  시점에 작업 완료(요청에서 종료까지 : 11ms)
C: 2ms부터 대기하다가, 12ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 16ms)

이 때 각 작업의 요청부터 종료까지 걸린 시간의 평균은 10ms(=(3+11+16)/3)가 됩니다.

하지만 A->C->B 순서대로 처리하면

A: 3ms 시점에 작업 완료 (요청에서 종료까지 : 3ms)
C: 2ms부터 대기하다가, 3ms 시점에 작업을 시작해서 9ms  시점에 작업 완료(요청에서 종료까지 : 7ms)
B: 2ms부터 대기하다가, 9ms 시점에 작업을 시작해서 18ms 시점에 작업 완료(요청에서 종료까지 : 17ms)

이렇게 A->C->B의 순서로 처리하면 각 작업의 요청부터 종료까지 걸린 시간의 평균은 9ms(=(3+7+17)/3)가 됩니다.


각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리하면 평균이 얼마나 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소주점 이하의 수는 버립니다)


풀이 방법:

 위에서 처음 소개한 방법은 FCFS 방법으로 먼저 들어오는 작업을 먼저 수행하는 것으로 긴 작업이 먼저 들어올 경우 뒤에 들어온 작업들이 수행하기까지 많은 시간을 대기하기 때문에 평균시간이 길어지게 된다. 따라서 이를 해결하기 위해서 후자의 방법인 SJF를 사용하는 것이다. 즉 짧은 요청을 먼저 수행하는 것이다. 별도의 정렬이 없어도 작은 값을 반환해줄 수 있는 힙 구조를 사용해서 이 문제를 풀어야 한다.

 last와 now라는 두 변수를 사용해서 하나의 작업이 들어간 시점과 나오는 시점을 구분해준다. 또한 이 두 변수를 이용해 구간을 구성하고 이 구간 사이에 있는 jobs들을 heap에 담도록 한다. heap에 담기전에 now에서 그 작업이 들어온 시점부터까지의 시간을 계산해서 더해준다.
 
 'C와 B의 작업은 A가 수행되고 있는 도중에 들어오게 되었으며, A가 끝나는 시점인 3ms 까지 각각 1ms, 2ms를 대기한다.'

또한 len(wait)와 wait[0]을 곱한 값을 더하기도 한다. 이 말은 다음과 같다.

 'C가 수행되는 동안에 B가 이미 들어와 있어서 같이 대기를 해야 한다. 즉 C의 수행시간인 6ms 만큼 B가 대기하고 있다. 총 12ms 만큼 시간이 더해져야 한다.'

와 같은 말이다. 

count 변수를 만들어서 이 변수가 jobs의 길이와 같이 지는 순간까지 반복하면 각 작업들이 총 수행되는 시간을 알 수 있고 이를 jobs의 길이로 나누어 준 몫을 구하면 평균을 구할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import heapq
def solution(jobs):
    last=-1
    now=0
    answer=0
    wait=[]
    n=len(jobs)
    count=0
    while(count<n):
        for job in jobs:
            if last <job[0]<=now:
                answer+=(now-job[0])
                heapq.heappush(wait,job[1])
        if len(wait)>0:
            answer+=len(wait)*wait[0]
            last=now
            now+=heapq.heappop(wait)
            count+=1
        else:
            now+=1
    return answer//n
cs


728x90
반응형

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

[BOJ]11050. 이항 계수 1  (0) 2019.05.08
[BOJ]11866. 조세퍼스 문제0  (0) 2019.05.07
[BOJ]8979. 올림픽  (0) 2019.05.05
[BOJ]1076. 저항  (0) 2019.05.04
[BOJ]1977. 완전제곱수  (0) 2019.05.03
728x90
반응형

문제:

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

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


728x90
반응형

'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
728x90
반응형

문제:

전자 제품에는 저항이 들어간다. 저항은 색 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


728x90
반응형

'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
728x90
반응형

문제:

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


728x90
반응형

'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
728x90
반응형

데이터 무결성

데이터의 정확성 또는 유효성을 의미한다. 일관된 데이터베이스 상태를 정의하는 규칙들을 묵시적, 명시적으로 정의한다. 데이터베이스가 갱신될 때마다 자동적으로 검사하므로 따로 검사할 필요가 없다.

 

도메인 제약조건

애트리뷰트 값이 반드시 원자값이어야 한다. 데이터 형식을 통해 값들의 유형을 제한하고, check 제약 조건을 통해 값들의 범위를 제한할 수 있음

 

키 제약조건

키 애트리뷰트에 중복된 값이 존재해서는 안된다는 것이다.

 

엔티티 무결성 제약조건

기본 키가 각 투플들을 식별하기 위해 사용되기 때문에 릴레이션의 기본 키를 구성하는 어떤 애트리뷰트도 널값을 가질 수 없다는 제약조건이다. 단 대체 키에는 적용되지 않는다.

 

참조 무결성 제약조건

참조 무결성 제약조건은 두 릴레이션의 연관된 투플들 사이의 일관성을 유지하는 데 사용된다. 릴레이션 R2의 외래 키가 릴레이션 R1의 기본 키를 참조할 때 참조 무결성 제약조건은 아래의 두 조건 중 하나가 성립되면 만족된다.

1. 외래 키의 값은 R1의 어떤 투플의 기본 키 값과 같음.

2. 널 값을 가진다.(외래 키가 자신의 릴레이션에서 기본키가 아니다.)

 

 

데이터베이스를 갱신할 때마다 무결성 제약조건을 유지시켜줘야 한다. 데이터베이스에 대한 갱신 연산은 삽입, 삭제, 변경 연산으로 구분하는데 DBMS는 각 갱신, 연산마다 필요한 조치를 취한다.

 

삽입

새로 삽입되는 투플의 기본 키 애트리뷰트의 값에 따라 도메인 제약조건, 키 제약조건, 엔티티 무결성 제약조건을 위배할 수 있다. 참조되는 릴레이션에 새로운 투플이 삽입되면 참조 무결성 제약조건은 위배되지 않으나, 참조하는 릴레이션에 삽입될 경우에는 위배될 수 있다.

 

삭제

참조하는 릴레이션에서 투플이 삭제되면 도메인 제약조건, 키 제약조건, 엔티티 무결성 제약조건, 참조 무결성 제약조건을 위배하지 않는다. 하지만 참조되는 릴레이션에서 투플이 삭제된다면 참조 무결성 제약조건을 위배하는 경우가 생긴다.

수정

DBMS는 수정하는 애트리뷰트가 기본 키인지 외래 키인지 검사한다. 수정하려는 애트리뷰트가 둘 다 아니면 참조 무결성 제약조건을 위배하지 않는다. 기본 키나 외래 키를 수정하는 것은 삽입이나 삭제를 하는 것과 같으므로 동일하게 적용된다.

 

참조 무결성 제약조건을 만족시키기 위한 DBMS가 제공하는 옵션

제한(restricted)

위배를 야기한 연산을 단순히 거절한다.

 

연쇄(cascade)

참조되는 릴레이션에서 투플을 삭제하고, 참조하는 릴레이션에서 이 투플을 참조하는 투플들도 함께 삭제해버린다.

 

널값(nullify)

참조되는 릴레이션에서 투플을 삭제하고, 참조하는 릴레이션에서 이 투플을 참조하는 투플들의 외래 키에 널값을 삽입한다.

 

디폴트 값

널값을 넣는 대신에 디폴트 값을 넣는다.

 

 

728x90
반응형
728x90
반응형

문제:

양수 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


728x90
반응형

'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
728x90
반응형

문제:

효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규칙이 있다.

1. 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다.
2. 연속으로 놓여 있는 3잔을 모두 마실 수는 없다.

효주는 될 수 있는 대로 많은 양의 포도주를 맛보기 위해서 어떤 포도주 잔을 선택해야 할지 고민하고 있다. 1부터 n까지의 번호가 붙어 있는 n개의 포도주 잔이 순서대로 테이블 위에 놓여 있고, 각 포도주 잔에 들어있는 포도주의 양이 주어졌을 때, 효주를 도와 가장 많은 양의 포도주를 마실 수 있도록 하는 프로그램을 작성하시오.

예를 들어 6개의 포도주 잔이 있고, 각각의 잔에 순서대로 6, 10, 13, 9, 8, 1만큼의 포도주가 들어 있을 때, 첫 번째, 두 번째, 네 번째, 다섯 번째 포도주 잔을 선택하면 총 포도주 양이 33으로 최대로 마실 수 있다.

입력:

첫째 줄에 포도주 잔의 개수 n이 주어진다. (1<=n<=10,000) 둘째 줄부터 n+1번째 줄까지 포도주 잔에 들어있는 포도주의 양이 순서대로 주어진다. 포도주의 양은 1,000 이하의 음이 아닌 정수이다.


출력:

첫째 줄에 최대로 마실 수 있는 포도주의 양을 출력한다.


풀이 방법:

 동적계획법을 사용해서 최댓값을 찾아내야 한다. 일단 크게 두 가지 경우로 나눌 수 있다. 3이상 n 이하의 수 i에 대해서 i를 선택하는 경우와 선택하지 않는 경우이다.


i) i번째 값을 선택하고자 할 때

i번째 값을 선택하고자 하면 다시 두 개의 경우로 나눌 수 있다.


0x00   ,    ?0x0


전자는 i번째와 i번째를 연속해서 고르는 경우, 후자는 그렇지 않은 경우이다. 전자의 경우에는 i번째와 i번째를 더하고 거기에 dp[i-3]번째 값을 더하고, 후자의 경우에는 i번째 값에 dp[i-2]를 더하는 경우이다. 


ii) i번째 값을 선택하지 않을 때

위 경우를 먼저 계산해준 후 dp[i-1] 과 dp[i] 중 최댓값을 선택하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
answer=[0]
a=int(input())
for i in range(a):
    answer.append(int(input()))
dp=[0]*(a+1)
dp[1]=answer[1]
if a>1:
    dp[2]=dp[1]+answer[2]
for i in range(3,len(dp)):
    dp[i]=max(answer[i]+answer[i-1]+dp[i-3],answer[i]+dp[i-2])
    dp[i]=max(dp[i-1],dp[i])
print(dp[a])
cs



728x90
반응형

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

[BOJ]1977. 완전제곱수  (0) 2019.05.03
[BOJ]1037. 약수  (0) 2019.05.02
[BOJ]2193. 이친수  (0) 2019.04.30
[BOJ]1003. 피보나치 함수  (0) 2019.04.26
[BOJ]9461.파도반 수열  (0) 2019.04.25

+ Recent posts