본문 바로가기
Problem Solving/SWEA

[ SWEA ] D2 - 1970, 1966, 1961, 1959 - python 문제풀이

by IM조이 2021. 6. 26.

1970 쉬운 거스름돈
지불할 수 있는 돈의 종류(option)들을 순회하면서, 최대한 낼 수 있는 개수만큼 쓰고 다음 단위(더 작은 지불 단위 옵션)으로 넘어가게 해서 풀 수 있음

options = [50000,10000,5000,1000,500,100,50,10]
for tc in range(int(input())):
    N = int(input())
    cnt = [0]*8
    for i in range(8):
        if N != 0:
            cnt[i] += N//options[i]
            N %= options[i]
        else:
            break
    print("#{}\n{}".format(tc+1, " ".join(map(str,cnt))))



1966 숫자를 정렬하자
방법 1 - sort 함수 사용
방법 2 - 개수를 세어나갈 카운트 배열을 활용해, 개수만큼 숫자를 출력

# 방법 1
for tc in range(int(input())):
    N = int(input())
    numbers = list(map(int, input().split()))
    print("#{} {}".format(tc+1, " ".join(map(str,sorted(numbers)))))
# 방법 2
for tc in range(int(input())):
    N = int(input())
    numbers = list(map(int, input().split()))
    cnt = [0]*(max(numbers)+1)
    for num in numbers:
        cnt[num] +=1
    print("#{}".format(tc+1),end="")
    for i in range(len(cnt)):
        if cnt[i] > 0:
            for _ in range(cnt[i]):
                print(" {}".format(i),end="")
    print()

 

참고) 버블정렬으로 구현하면?

T = int(input())
for tc in range(T):
    a = int(input())
    b = list(map(int, input().split()))
    for i in range(len(b) - 1, 0, -1):
        for j in range(0, i):
            if b[j] > b[j + 1]:
                b[j], b[j + 1] = b[j + 1], b[j]

    print('#{} {}'.format((tc + 1), ' '.join(map(str, b))))

 

1961 숫자 배열 회전
접근 - 배열이 들어오면, 그 배열을 90도로 회전한 결과를 리턴시켜주는 함수를 만들어서 총 3번 회전시킨다

def change(li):
    n = len(li)
    new = [[0]*n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            new[i][j] = li[n-1-j][i]
    return new

for tc in range(int(input())):
    N = int(input())
    matrix = [list(map(int, input().split())) for _ in range(N)]
    result = [['']*N for _ in range(N)]
    change_90 = change(matrix)
    change_180 = change(change_90)
    change_270 = change(change_180)
    for i in range(N):
        result[i][0] = "".join(map(str,change_90[i]))
        result[i][1] = "".join(map(str,change_180[i]))
        result[i][2] = "".join(map(str,change_270[i]))
    print("#{}".format(tc+1))
    for row in result:
        print(' '.join(row))

 

예전에 처음 풀었을때는 시간이 좀 있어서 규칙을 찾아 풀이했었다

for tc in range(int(input())):
    n = int(input())
    p = [list(map(int, input().split())) for _ in range(n)]
    r = [[0]*3 for _ in range(n)]
    for i in range(n):
        num1 = ''
        for j in range(n-1,-1,-1):
            num1 += str(p[j][i])
        r[i][0] = num1
        num2 = ''
        for k in range(n-1,-1,-1):
            num2 += str(p[n-i-1][k])
        r[i][1] = num2
        num3 = ''
        for l in range(n):
            num3 += str(p[l][n-i-1])
        r[i][2] = num3
    print("#{}".format(tc+1))
    for rr in r:
        print(" ".join(map(str, rr)))

 

1959 두 개의 숫자열
접근 - 더 긴 배열과 짧은 배열을 찾고, ((긴 배열 원소 수) -(짧은 배열 원소 수) +1) 만큼 이동하면서 최대값 나오면 갱신

for tc in range(int(input())):
    N,M = map(int, input().split())
    li = [list(map(int, input().split())) for _ in range(2)]
    max_value = float("-inf")
    if N > M: # 이게 싫으면, 함수로 만들어서
        small,big = li[1],li[0]
    else:
        small,big = li[0],li[1]
    for i in range(len(big)-len(small)+1):
        tmp = 0
        for j in range(len(small)):
            tmp += small[j]*big[j+i]
        if tmp > max_value: # 매번 비교해주거나 빈리스트에 담아서 max만 출력해도
            max_value = tmp
    print("#{} {}".format(tc+1, max_value))

코드가 좀 복잡하다 싶으면 다음처럼 함수로 구현하는 것도 방법

def cal(l,s): # 긴 배열, 짧은 배열 순으로 들어온다
    maxV=0
    j=0
    while j<len(l)-len(s)+1:
        cnt = 0
        for i in range(len(s)):
            cnt += s[i]*l[i+j]
        if cnt > maxV:
            maxV = cnt
        j += 1
    return maxV

for tc in range(int(input())):
    N,M=map(int, input().split())
    a=list(map(int, input().split()))
    b=list(map(int, input().split()))
    if N>M:
        print("#{} {}".format(tc+1,cal(a, b)))
    else:
        print("#{} {}".format(tc+1,cal(b,a)))

 

댓글