테크니션 :: 테크니션
반응형

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

입력

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.

합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.

예제 입력 1 

5 21
5 6 7 8 9

예제 출력 1 

21

예제 입력 2 

10 500
93 181 245 214 315 36 185 138 216 295

예제 출력 2 

497

힌트에 브루트포스 알고리즘을 확인하고 검색을 하였는데 예시가 하나 나왔다

(브루트포스 알고리즘이 무엇인지는 검색하면 자세하게 나와있다)

출처는 해당 이미지를 누르면 나온다

그래서 다중 for문을 통해 모든 3개 조합의 합을 구하는 코드를 만들었다

import sys
a = list(map(int, sys.stdin.readline().split()))
b = list(map(int, sys.stdin.readline().split()))
ans = []
for i in range(0,a[0]):
    for j in range(1,a[0]):
        if i !=j :
            for k in range(2, a[0]):
                if i !=k and j !=k:
                    if (b[i]+b[j]+b[k] not in ans):
                        ans.append(b[i]+b[j]+b[k])
ans_minus = [abs(x-a[1]) for x in ans]
print(ans[ans_minus.index(min(ans_minus))])

모든 세 수의 합을 ans에 삽입

리스트의 모든 원소에서 목표값을 뺀 절대값 리스트를 구함

구한 절대값 중에서 가장 작은 값의 인덱스를 구해서 ans[인덱스] 를 출력

결과 : 시간초과

그래서 리스트를 만들지 않고 세 수의 합을 그때 그때 비교해서 작은 값만 살리는 방향으로 코드를 수정했다

import sys
a = list(map(int, sys.stdin.readline().split()))
b = list(map(int, sys.stdin.readline().split()))
ans = 0
for i in range(0,a[0]):
    for j in range(1,a[0]):
        if i !=j :
            for k in range(2, a[0]):
                if i !=k and j !=k:
                    if b[i]+b[j]+b[k] <= a[1] and ans < b[i]+b[j]+b[k]:
                        ans = b[i]+b[j]+b[k]
print(ans)

 

반응형
반응형

https://www.acmicpc.net/problem/18258

 

18258번: 큐 2

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

  • push X: 정수 X를 큐에 넣는 연산이다.
  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 큐에 들어있는 정수의 개수를 출력한다.
  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 2,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

예제 입력 1 

15
push 1
push 2
front
back
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
front

예제 출력 1 

1
2
2
0
1
2
-1
0
1
-1
0
3

코드는 이렇다


import sys
n = int(sys.stdin.readline())
lllist = []
for i in range(n):
    k = sys.stdin.readline().split()
    if k[0] == 'push':
        lllist.append(k[1])
    if k[0] == 'pop':
        if len(lllist) == 0:
            print("-1")
        if len(lllist) >0:
            print(lllist[0])
            lllist = lllist[1:]
    if k[0] == 'size':
        print(len(lllist))
    if k[0] == 'empty':
        if len(lllist) == 0:
            print("1")
        if len(lllist) >0:
            print("0")
    if k[0] == 'front':
        if len(lllist) == 0:
            print("-1")
        if len(lllist) >0:
            print(lllist[0])
    if k[0] == 'back':
        if len(lllist) == 0:
            print("-1")
        if len(lllist) >0:
            print(lllist[-1])

- 입력 받을 명령어가 2개(push, 1) 이어서 str을 split 해서 list로 받아줘야함

- 시간초과의 이유를 모르겠음

- 전에 작성햇던 스택과 비슷함

반응형
반응형

https://www.acmicpc.net/problem/11866

 

11866번: 요세푸스 문제 0

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

www.acmicpc.net

요세푸스 문제는 다음과 같다.

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)

출력

예제와 같이 요세푸스 순열을 출력한다.

예제 입력 1 

7 3

예제 출력 1 

<3, 6, 2, 7, 5, 1, 4>

출력을 내는 코드는 만들었다

import sys
n = int(sys.stdin.readline())
k = int(sys.stdin.readline())
lllist = list(range(1, n+1))
ans = []
for i in range(0,n):
        lllist = lllist[k-1:] +lllist[:k-1]
        ans.append(lllist[0])
        lllist.remove(lllist[0])
print(ans)

1 2 3 4 5 6 7 

↓ k-1 만큼 이동

3 4 5 6 7 1 2

↓ pop (3)

4 5 6 7 1 2

↓ k-1 만큼 이동

6 7 1 2 4 5

↓ pop (6) [3, 6]

7 1 2 4 5

↓ k-1 만큼 이동

2 4 5 7 1

↓ pop (2) [3, 6, 2]

4 5 7 1

↓ k-1 만큼 이동

7 1 4 5

↓ pop (7) [3, 6, 2,7]

1 4 5

↓ k-1 만큼 이동

5 1 4

↓ pop (5) [3, 6, 2,7 , 5]

1 4

↓ k-1 만큼 이동

1 4

↓ pop (1) [3, 6, 2,7, 5,1]

↓ pop (4) [3, 6, 2,7, 5,1,4]

runtime error가 뜨는데 댓글로 알려주실분 환영합니다

반응형

+ Recent posts