[SWEA] D3 문제 풀이 - 1

kiteB·2022년 6월 2일
1

SWEA

목록 보기
4/6
post-thumbnail

📌 [S/W 문제해결 기본] 2일차 - Sum (1209)

🔗 문제 링크

for _ in range(1, 11):
    test_case = int(input())
    array = [list(map(int, input().split())) for _ in range(100)]
    answer = 0

    for i in range(100):
        temp = 0
        for j in range(100):
            temp += array[i][j]
        answer = max(answer, temp)

    for i in range(100):
        temp = 0
        for j in range(100):
            temp += array[j][i]
        answer = max(answer, temp)

    temp = 0
    for i in range(100):
        temp += array[i][i]
    answer = max(answer, temp)

    print(f"#{test_case} {answer}")
  • 세 개의 for문을 이용하여 각 행/열/대각선의 합 중 가장 큰 값으로 answer를 업데이트해준다.
    • 첫 번째 for문: 각 행의 합
    • 두 번째 for문: 각 열의 합
    • 세 번째 for문: 각 대각선의 합

📌 [S/W 문제해결 기본] 3일차 - String (1213)

🔗 문제 링크

for _ in range(1, 11):
    test_case = int(input())
    target = input()
    sentence = input()
    print(f"#{test_case} {sentence.count(target)}")
  • count()를 이용하여 단어의 개수를 구한다.

📌 [S/W 문제해결 기본] 3일차 - 회문1 (1215)

🔗 문제 링크

def find_palindrome(array):
    result = 0

    for line in array:
        for i in range(8 - n + 1):
            target = line[i:i+n]
            if target == target[::-1]:
                result += 1

    return result


for test_case in range(1, 11):
    n = int(input())
    board = [list(input().strip()) for _ in range(8)]

    answer = find_palindrome(board)
    board = list(zip(*board[::-1]))
    answer += find_palindrome(board)
    
    print(f"#{test_case} {answer}")
  • 열을 기준으로 회문을 찾는 함수find_palindrome를 만들어서 열을 기준으로 탐색하여 찾은 회문 수를 answer에 저장한다.
  • 90도 회전시킨 board를 인자로 다시 find_palindrome을 호출해서 찾은 회문 수를 answer에 더한다.

📌 [S/W 문제해결 기본] 10일차 - 비밀번호 (1234)

🔗 문제 링크

for test_case in range(1, 11):
    n, s = input().split()
    stack = [s[0]]

    for i in range(1, int(n)):
        if len(stack) != 0 and stack[-1] == s[i]:
            stack.pop()
        else:
            stack.append(s[i])

    print(f"#{test_case} {''.join(map(str, stack))}")
  • 비밀번호를 하나씩 꺼내서 stack에 넣은 뒤, 스택이 비어있지 않고 제일 위에 있는 원소가 현재 원소와 동일하다면 pop()을, 앞의 경우가 아니라면 append()를 이용하여 현재 원소를 stack에 넣어준다.

📌 진기의 최고급 붕어빵 (1860)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    n, m, k = map(int, input().split())
    times = sorted(list(map(int, input().split())))
    bread = 0
    flag = True

    idx = 0
    for i in range(0, times[-1] + 1):
        if i > 0 and i % m == 0:
            bread += k

        if times[idx] <= i:   # 손님 도착 시간이 되면
            if bread > 0:
                bread -= 1
                idx += 1
            else:
                flag = False
                break

    if flag:
        print(f"#{test_case} Possible")
    else:
        print(f"#{test_case} Impossible")
  • 손님 도착 시간이 되었을 때 bread의 값을 검사하여 제공 가능 여부를 판단한다.

📌 농작물 수확하기 (2805)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    n = int(input())
    board = [list(map(int, input().strip())) for _ in range(n)]
    answer = 0
    count = 0

    for i in range(n):
        gap = abs(n // 2 - i)
        answer += sum(board[i][gap:n - gap])
    print(f"#{test_case} {answer}")
  • 정사각형 마름모 형태가 되도록 인덱스를 조정하여 answer에 농작물의 가치를 더해주면 된다.

📌 부분 수열의 합 (2817)

🔗 문제 링크

from itertools import combinations

T = int(input())

for test_case in range(1, T + 1):
    n, k = map(int, input().split())
    numbers = list(map(int, input().split()))
    answer = 0

    for i in range(1, n + 1):
        for combi in combinations(numbers, i):
            if sum(combi) == k:
                answer += 1

    print(f"#{test_case} {answer}")
  • combinations를 이용하여 모든 조합을 구한 뒤, 이 부분 수열의 합이 K가 될때마다 answer를 1씩 증가시킨다.

📌 영준이와 신비한 뿔의 숲 (3142)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    n, m = map(int, input().split())
    animal = [0, 0]    # 유니콘, 트윈혼
    animal[1] = n // 2
    animal[0] = n - (2 * animal[1])

    while sum(animal) != m:
        if sum(animal) > m:
            animal[0] -= 2
            animal[1] += 1
        else:
            animal[0] += 2
            animal[1] -= 1

    print(f"#{test_case}", *animal)
  • 먼저 최대한 트윈혼의 개수가 많도록 animal 값을 만든 다음, animal의 합이 m이 같아질 때까지 트윈혼과 유니콘의 개수를 조정해준다.

📌 두 수의 덧셈 (3260)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    a, b = map(int, input().split())
    print(f"#{test_case} {a + b}")

📌 보충학습과 평균 (3314)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    scores = list(map(int, input().split()))
    total = 0

    for score in scores:
        total += max(40, score)

    print(f"#{test_case} {total // 5}")

📌 준환이의 운동관리 (3431)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    l, u, x = map(int, input().split())
    answer = 0

    if x < l:
        answer = l - x
    elif x > u:
        answer = -1

    print(f"#{test_case} {answer}")

📌 직사각형 길이 찾기 (3456)

🔗 문제 링크

from collections import Counter

T = int(input())

for test_case in range(1, T + 1):
    a, b, c = map(int, input().split())
    counter = Counter((a, b, c)).most_common(2)
    most = sorted(counter, key=lambda x: x[1])
    print(f"#{test_case} {most[0][0]}")
  • (a, b, c)를 등장 횟수를 기준으로, 오름차순으로 정렬한다.

📌 퍼펙트 셔플 (3499)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    n = int(input())
    cards = list(input().split())
    mark = n // 2 + n % 2
    answer = []

    for i in range(n // 2):
        answer.append(cards[i])
        answer.append(cards[i + mark])

    if n % 2 == 1:
        answer.append(cards[n // 2])

    print(f"#{test_case} {' '.join(map(str, answer))}")
  • 문제에서 원하는 조건대로 덱을 두 가지로 나누는 기준점을 mark에 저장한다.
  • 0부터 n // 2 - 1까지 mark를 기준으로 왼쪽에 있는 덱에서 한 개, 오른쪽에 있는 덱에서 한 개를 꺼내서 answer에 넣어준다.
  • 만약 카드의 개수가 홀수였다면 하나가 남게 되므로 남은 카드를 answer에 넣어준다.

📌 Digit sum (3750)

🔗 문제 링크

T = int(input())
answer = []

for _ in range(T):
    n = input()

    while len(n) > 1:
        n = str(sum(map(int, n)))

    answer.append(n)

for i in range(T):
    print(f"#{i + 1} {answer[i]}")
  • n의 길이가 1이 될 때까지 n의 합으로 n 값을 업데이트해준다.
profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글