코딩테스트/SW Expert Academy

SWEA. D2(difficult) 1~10 Python

1son 2023. 10. 16. 14:16

1859. 백만 장자 프로젝트

t=int(input())
for tc in range(1,t+1):
    n=int(input())
    lst = list(map(int,input().split()))

    result=0
    maxValue=lst[-1]

    for i in range(n-2,-1,-1):
        value=lst[i]
        if maxValue<=value:
            maxValue=value
        else:
            result+=(maxValue-value)

    print(f'#{tc} {result}')

*for문 안에 n-2 로 들어간다는 것

*list로 입력 받기

*maxValue와 value 가 같을 경우도 넣어줘야 한다. 

 

 

 

1926. 간단한 369게임

n = int(input())

clap='-'
lst=[]
three=['3','6','9']
for i in range(1,n+1):
    string = str(i)
    if string in three:
        lst.append(clap)
    else:
        lst.append(i)

print(*lst)

* 나는 1~10까지 밖에 구현 못하였다,,

 

n = int(input())
clap=['3','6','9']

for i in range(1,n+1):
    count=0
    for j in str(i):
        if j in clap:
            count+=1
    if count>0:
        i='-'*count
    print(i,end=' ')

* count 변수 이용해서 3,6,9 개수마다 - 의 수를 늘려줄 수 있었다. 

* i 변수에 숫자대신 '-' 를 넣어주는 방식 -> i만 출력해주면 됨 -> end=' ' 를 통해 한줄로 출력 가능하다.

* for j in str(i) 를 통해 각 자릿수를 확인할 수 있다.

 

 

 

2007. 패턴 마디의 길이

 *풀이보고 했다.

t=int(input())
for tc in range(1,t+1):
    a = list(input())
    s=0

    for i in range(1,10):
        if a[0] != a[i] or a[1] != a[i+1]:
            s+=1
        else:
            break
    s+=1
    print(f'#{tc} {s}')

* 10글자 내외라는 점을 이용해서 for문 돌린다

* 두글자 일치하는지 확인하고 일치하면 +1 해준다.

* a[0] 은 처음에 카운트 되지 않았으니 마지막에 s+=1 을 해준다.

 

 

 

2005. 파스칼의 삼각형

t = int(input())
for tc in range(1,t+1):
    n=int(input())
    a=1
    print(f'#{tc}')
    print(a)
    for i in range(1,n):
        lst = [1]
        for j in range(0,i-1):
            lst.append(i)
        lst.append(1)
        print(*lst)


* 이렇게 야매로 해결해보려했으나 5이상부터는 적용되지 않았다. 

* 풀이를 찾아보았다.

 

t=int(input())
for tc in range(1,t+1):
    n=int(input())
    pascal = [n*[0] for _ in range(n)]
    pascal[0][0]=1
    for i in range(1,n):
        for j in range(n):
            if j==0:
                pascal[i][j]=1
            else:
                pascal[i][j]=pascal[i-1][j-1]+pascal[i-1][j]
    print(f'#{tc}')
    for k in range(n):
        for l in range(n):
            if pascal[k][l]:
                print(pascal[k][l],end=' ')
        print()

* pascal = [[0] * N for _ in range(N)] 이 줄을 통해 

   n을 4를 입력하면

이렇게 생긴 리스트 반환됨 ! 

*pascal[0][0]=1 로 값을 넣어놓고 시작함

* if pascal[k][l] 은 0이 되어있는 것은 빼고 출력하기 위해서 

 

 

 

2001. 파리 퇴치

* 또 풀이를 찾아보았다. D2 어렵따

 

[SWEA] #2001. 파리퇴치_파이썬

풀기 전 생각해보기😮 이차원 배열에서 파리채를 휘둘렀을 때 잡을 수 있는 파리 수 탐색 가능한 모든 경우의 수 탐색 풀이🛫 T = int(input()) for a in range(T): N, M = map(int, input().split()) arr = [list(map(in

hei-jayden.tistory.com

t=int(input())
for tc in range(1,t+1):
    n,m = map(int,input().split())
    arr = [list(map(int,input().split())) for _ in range(n)]

    kills=[]
    for i in range(n-m+1):
        for j in range(n-m+1):
            fly=0
            for k in range(m):
                for l in range(m):
                    fly+=arr[i+k][j+l]
            kills.append(fly)

    print(f'#{tc} {max(kills)}')

 

arr = [list(map(int,input().split())) for _ in range(n)]

* 이 줄을 통해 리스트로 한 줄 한 줄 입력받는다. n번 리스트를 입력받는다

* range(N-M+1) : 파리채를 휘두를 수 있는 공간
ex) M의 크기가 1일 경우, 모든 배열 공간을 대상으로 탐색할(파리채를 휘두를) 수 있다. 그런데 파리채의 크기가 커지게 되면, 탐색할 수 있는 배열 공간은 줄어들게 된다. 이에 따라 탐색 범위를 조절해줘야 하기 때문에 N-M+1으로 조정하였다.

  • N이 5일 때, 파리채(M)이 1일 때 휘두를 수 있는 경우의 수 = 25가지
  • 동일한 조건에서 M = 2일 때 휘두를 수 있는 경우의 수 = 16가지
  • 동일한 조건에서 M = 3일 때 휘두를 수 있는 경우의 수 = 9가지 ... 
for k in range(M):
    for l in range(M):
        fly += arr[i+k][j+l]
kills.append(fly)

*(M*M)을 한 번 다 탐색 후 (값은 fly에 차곡 차곡 쌓였음) fly 값을 kils 배열에 넣어줌

 

 

 

1989. 초심자의 회문 검사

t=int(input())
for tc in range(1,t+1):
    data = list(input())
    n=len(data)
    result=1
    for i in range(n):
        j=n-1-i
        if data[i] != data[j]:
            result=0
            break
    print(f'#{tc} {result}')

 

 

 

1986. 지그재그 숫자

t=int(input())
for tc in range(1,t+1):
    n=int(input())
    result=0
    for i in range(1,n+1):
        if i%2==0:
            result-=i
        else:
            result+=i
    print(f'#{tc} {result}')

 

 

 

1984. 중간 평균값 구하기

t=int(input())
for tc in range(1,t+1):
    arr=list(map(int,input().split()))
    maxV=max(arr)
    minV=min(arr)
    arr.remove(maxV)
    arr.remove(minV)
    #hap=0
    hap=sum(arr)
    avg=0
    #for j in arr:
        #hap+=j
    print(f'#{tc} {round(hap/8)}')

*for 문 이용해서 안합치구 sum() 쓰면 된다.

 

 

 

 

1983. 조교의 성적 매기기

t=int(input())
for tc in range(1,t+1):
    n,k=map(int,input().split())
    arr=[list(map(int,input().split())) for _ in range(n)]
    allValue=[]
    for i in range(n):
        value = 0
        for j in range(3):
            if j==0:
                value+=arr[i][j]*0.35
            if j==1:
                value+=arr[i][j]*0.45
            if j==2:
                value+=arr[i][j]*0.2
        allValue.append(value)
    allValue.sort(reverse=True)
    
    print(allValue)

* 나는 총합 리스트를 구하는 것까지 밖에 생각 못하였다.

* 다른 사람의 풀이를 찾아보았다.

 

SWEA 1983 조교의 성적 매기기 (파이썬)

문제 링크 > 내 코드 > 포인트 처음에 문제를 잘못 이해해서 굉장히 헤맸..

velog.io

T = int(input())
grades = ['A+', 'A0', 'A-', 'B+', 'B0', 'B-', 'C+', 'C0', 'C-', 'D0']
for tc in range(1, T+1):
    N, K = map(int, input().split())
    total_list = []
    for _ in range(N): # n번 돌아
        mid, final, hws = map(int, input().split())
        total = (mid * 0.35) + (final * 0.45) + (hws*0.2)
        total_list.append(total)
        # [74.6, 92.55000000000001, 88.8, 99.45, 72.35, 85.85000000000001, 96.25, 68.95, 85.5, 85.75]

    # k번 학생의 점수
    # 먼저 k번째 학생의 인덱스를 구해주고
    k_score = total_list[K-1]
    
    # 정렬
    total_list.sort(reverse=True)
    # [99.45, 96.25, 92.55000000000001, 88.8, 85.85000000000001, 85.75, 85.5, 74.6, 72.35, 68.95]
    div = N//10
    final_k_score = total_list.index(k_score) // div

    print('#{} {}'.format(tc, grades[final_k_score]))

*mid, final, hws로 각각 나눠서 입력받는 것

*sort() 사용시 reverse=True 해줘서 내림차순 만드는것

*list.index() 해서 최종 출력값 구해주는 것 

 

t=int(input())
grades = ['A+','A0','A-','B+','B0','B-','C+','C0','C-','D0']

for tc in range(1,t+1):
    n,k = map(int,input().split())
    allValue=[]
    for i in range(n):
        mid,final,hws = map(int,input().split())
        finalValue = (mid*0.35) + (final*0.45) + (hws*0.2)
        allValue.append(finalValue)

    k_value = allValue[k-1]
    allValue.sort(reverse=True)
    div = n//10
    final_k_value = allValue.index(k_value)//div

    print(f'#{tc} {grades[final_k_value]}')

 

 

 

1979. 어디에 단어가 들어갈 수 있을까

*그.. dp인가 dfs 문제 인것 같은데.. 이런 문제 많이 봤는데 ,.. 왜 못풀겟지 .. 아 진짜... 짜증놔...

 

SWEA[D2] (Python) 1979번 어디에 단어가 들어갈 수 있을까 풀이

Python으로 구현한 1979번 어디에 단어가 들어갈 수 있을까 문제 풀이입니다. https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5PuPq6AaQDFAUq&categoryId=AV5PuPq6AaQDFAUq&categoryType=CODE&pr

unie2.tistory.com

* 좀만 더 생각해볼걸..

t=int(input())
for tc in range(1,t+1):
    n,k = map(int,input().split())
    data = [list(map(int,input().split())) for _ in range(n)]

    result=0
    for i in range(n):
        count=0
        for j in range(n):
            if data[i][j] == 1:
                count+=1
            if data[i][j] == 0 or j==n-1:
                if count == k:
                    result+=1
                if data[i][j]==0:
                    count=0

    for i in range(n):
        count=0
        for j in range(n):
            if data[j][i] == 1:
                count+=1
            if data[j][i] == 0 or j==n-1:
                if count == k:
                    result+=1
                if data[j][i]==0:
                    count=0

    print(f'#{tc} {result}')

*그냥 구현이었네 

 

 

10문제 끄읏