본문 바로가기

코딩테스트

[Python] 다양한 문제 풀어보기

동아리 마지막 과제

여러 문제 풀어보기! 

 

https://www.acmicpc.net/workbook/view/8708

여기에 있는 다양한 유형의 문제들을 풀어본다.


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

import sys
input = sys.stdin.readline

# 예제 : 10 10 2 2 -> 16
# 예제 : 50000 50000 11 9 -> 20835000
H, W, N, M = map(int, input().split()) 
a = H//(N+1)
if H%(N+1)!=0:
    a+=1
b = W//(M+1)
if W%(M+1)!=0:
    b+=1

print(a*b)
  • 단순 사칙연산 문제.
  • 나는 if문을 이용했지만, 그냥 나누기 연산 후 반올림을 해주는게 편할 듯

 

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

import sys
input = sys.stdin.readline

S = set()
M= int(input())
for _ in range(M):
    k = list(map(str, input().split()))
    if k[0] == 'add':
        S.add(int(k[1]))
    elif k[0]=='remove':
        if int(k[1]) in S:
            S.remove(int(k[1]))
    elif k[0]=='check':
        if int(k[1]) in S:
            print(1)
        else:
            print(0)
    elif k[0]=='toggle':
        if int(k[1]) in S:
            S.remove(int(k[1]))
        else:
            S.add(int(k[1]))
    elif k[0]=='all':
        S = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}
    else:
        S = set()
  • 그냥 구현 문제. python에서 {}는 dictionary이므로 set()으로 집합을 선언한다.

 

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

n = int(input())
if n % 2 == 0:
    print('CY')
else:
    print('SK')
  • 1이면 CY, 2이면 SK, 3이면 CY...해서 단순하게 점화식을 구할 수 있다.
  • 원리는 돌을 1개 혹은 3개를 가져갈 수 있으므로 한 쪽이 이기는 경우의 수는 n-2, n-4...가 되고, 나머지는 n-1, n-3...이 되는 것. 결국 홀수/짝수로 답을 구할 수 있따.

 

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

# 내 풀이
# 반례
# 1
# 1 19 20 17 18 15 16 13 14 11 12 9 10 7 8 5 6 3 4 1 2

P = int(input())

for _ in range(P):
    T = list(map(int, input().split()))
    max_A = 0
    ans = 0
    for i in range(len(T)-1):
        if max_A<T[i+1]:
            max_A=T[i+1]
        else:
            ans += (i)
    print(T[0], ans)
  • 단순 구현을 하면 되는 줄 알았는데 왜 안되지
# 정답 풀이
P=int(input())
for _ in range(P):
    arr=list(map(int,input().split()))
    total=0
    for i in range(1,len(arr)-1):
        for j in range(i+1,len(arr)): # i 뒤에 애들과 전부 비교해서
            if arr[i] > arr[j]:  # i가 더 크면
                arr[i],arr[j] = arr[j],arr[i]  # 자리바꾸기
                total+=1
    print(arr[0], total)
  • 문제 이해를 잘 못 했다. 버블 정렬에서 교환 횟수를 세는 문제.

 

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

N, K = map(int, input().split())
N_list = []
for _ in range(N):
    a = list(map(int, input().split()))
    N_list.append(a)
G_list = sorted(N_list, key=lambda x : (-x[1], -x[2], -x[3]))
# print(G_list)
ans = [0]*(N+1) # 답
num = 1 # 등수

for i in range(N):
    if i==0:
        ans[G_list[i][0]] = num
    else:
        if G_list[i][1:] != G_list[i-1][1:]:
            num=(i+1)
            ans[G_list[i][0]] = num
        else:
            ans[G_list[i][0]] = num

print(ans[K])
#20점 넘기 반례
#4 3
#1 1 0 0
#2 2 0 0
#3 1 0 0
#4 2 0 0
  • lambda를 이용해 금메달, 은메달, 동메달 순으로 내림차순 다중정렬을 수행한다.
  • 그 후 맨 앞부터 돌며 앞 국가와 공동 순위 인지 확인하고 해당 국가의 번호를 인덱스로 ans 리스트에 등수를 저장한다.
  • 처음에 20점이 나왔는데, 공동 순위가 있는 경우를 잘 고려 해야 한다. 앞 국가의 개수 +1이 자신의 순위 이므로 (i+1)이 순위가 된다. 공동일 때는 더하지 않고 그대로 순위 유지.

 

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

a = ['a','e','i','o','u']

while True:
    n = input()
    k = 0
    if n=='end':
        break
    if not('a' in n or 'e' in n or 'i' in n or 'o' in n or 'u' in n):
        k=1

    if len(n)>=3:
        for i in range(len(n)-2):
            b = [x for x in n[i:i+3] if x not in a] # a - n[i:i+3]
            if len(b)==0 or len(b)==len(n[i:i+3]):
                k=1

    if len(n)>=2:
        for i in range(len(n)-1):
            if not(n[i]=='e' or n[i]=='o'):
                if n[i]==n[i+1]:
                    k=1

    if k==1:
        print("<"+n+">"+" is not acceptable.")
    else:
        print("<"+n+">"+" is acceptable.")
  • 그냥 구현 문제 2번 조건에서 리스트끼리의 뺼셈 구현이 조금 복잡했다. set()으로도 할 수 있었지만..귀찮았음.

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

import sys
input = sys.stdin.readline

N, G = map(str, input().split())
n_list = set()
for _ in range(int(N)):
    n_list.add(input())
if G=='Y':
    print(len(n_list)//1)
elif G=='F':
    print(len(n_list)//2)
else:
    print(len(n_list)//3)
  • set()을 이용하여 개별 플레이어가 몇명인지 구한 후 게임에 맞게 몫을 구해준다.
  • 입력 횟수가 꽤 있으므로 sys를 이용해 input을 빠르게 해주자. 시간초과는 안나지만 꽤 걸림.

 

 

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

import sys
input = sys.stdin.readline

N = int(input())
cookie = [input().strip() for _ in range(N)]
ans = [0,0,0,0,0]

head_T = False
for i in range(N): # 행
    for j in range(N): # 열
        if not head_T and cookie[i][j]=='*':
            head = [i, j]
            head_T=True

# 팔 구하기
for i in range(N):
    # 왼쪽 팔
    if cookie[head[0]+1][i]=='*' and i<head[1]:
        ans[0]+=1
    # 오른쪽 팔
    elif cookie[head[0]+1][i]=='*' and i>head[1]:
        ans[1]+=1

# 허리 구하기
for i in range(head[0]+2, N):
    if cookie[i][head[1]]=='*':
        ans[2] += 1
    else:
        leg = i # 다리를 세기 위해 기록
        break

# 다리 구하기
for i in range(leg, N):
    # 왼쪽 다리
    if cookie[i][head[1]-1]=='*':
        ans[3]+=1
    if cookie[i][head[1]+1]=='*':
        ans[4]+=1

print(head[0]+2, head[1]+1)
print(*ans)
  • 구현 문제. 먼저 구하기 쉬운 머리의 좌표를 구한 후 팔/허리/다리 로 나누어 각각 구해주었다.
  • 출력은 머리가 아닌 심장이므로 주의!

 

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

# 정답 풀이
N, new_score, P = map(int, input().split())
if N!=0:
    now_list = list(map(int, input().split()))
    if N==P and now_list[-1]>=new_score:
        print(-1)
    else:
        rank = N+1
        for i in range(N):
            if now_list[i]<=new_score:
                rank = i+1
                break
        print(rank)
else:
    print(1)
 

[알고리즘][Python] 백준(BOJ) 1205 등수 구하기_파이썬

 

alpyrithm.tistory.com

  • 반례를 잘 찾아서 해야 하고, N과 P의 차이를 잘 이용해야 한다.
  • for문으로 주어진 점수 리스트를 돌면서 현재 score와 비교하고 rank를 부여한다. 이 때  N==P이고 가장 작은 점수가 새로운 점수보다 크다면 -1을 출력한다.
  • for문을 돌았는데 새로운 점수보다 작은 점수가 없다면 N+1이 rank가 된다.

 

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

N = int(input())
N_list = list(map(int, input().split()))
M = int(input())

N_list.sort()
if sum(N_list)<M:
    print(N_list[-1])
else:
    max_num = 0
    for i in range(N):
        max_num = max(max_num, (M-sum(N_list[:i]))//(N-i))
    print(max_num)
  • 단순 연산. 만약 예산액의 총 합이 M을 넘지 않는다면 최댓값을 출력한다.
  • 만약 넘는다면, 예산액 리스트를 오름차순으로 돌면서 최대 상한액을 찾는다. for문을 통해 M에서 특정 예산액을 뺀 후 남은 금액을 나눠줌.

 


# 회고

 

한..10개씩 정리할 거임. 일단 실버까지는 문제 없이 풀면 좋겠는데 될지는 모르겠다...ㅎ

이거 하고 내가 약한 분야를 다시 복습하자.

'코딩테스트' 카테고리의 다른 글

[Python] 기하  (0) 2024.06.07
[Python] 동적 프로그래밍 문제 풀이 정리(1)  (1) 2024.06.06
[Python] 동적 계획법  (0) 2024.06.01
[Python] 조합 문제 풀이 정리(2)  (0) 2024.05.30
[Python] 조합 문제 풀이 정리(1)  (0) 2024.05.29