[SWEA] D2 문제 풀이 - 1

kiteB·2022년 5월 31일
0

SWEA

목록 보기
2/6
post-thumbnail

📌 [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (1204)

🔗 문제 링크

from collections import Counter
T = int(input())

for _ in range(T):
    n = int(input())
    numbers = list(map(int, input().split()))
    answer = 0

    counter = Counter(numbers).most_common()
    counter.sort(key=lambda x: (-x[1], -x[0]))
    print(f'#{n} {counter[0][0]}')
  • Counter를 이용하여 점수의 등장 횟수를 구한 뒤, sort()를 이용하여 등장 횟수, 점수 순으로 내림차순으로 정렬한다.
    • 점수를 정렬 조건에 추가하는 이유는 최빈수가 여러 개일 경우 점수가 높은 순대로 정렬하기 위함이다.

📌 수도 요금 경쟁 (1284)

🔗 문제 링크

  • A사: 1리터 당 P원의 돈을 내야 한다.
  • B사: 기본 요금이 Q원이고, 월간 사용량이 R리터 이하인 경우 요금은 기본 요금만 청구된다. 하지만 R리터보다 많은 양을 사용한 경우 초과량에 대해 1리터당 S원의 요금을 더 내야 한다.
T = int(input())

for test_case in range(1, T + 1):
    p, q, r, s, w = map(int, input().split())
    answer = min(w * p, q + max(0, w - r) * s)
    print(f"#{test_case} {answer}")
  • A사 사용했을 때의 요금: w(수도의 양) * P
  • B사 사용했을 때의 요금: max(0, w - r)(기본 요금을 초과한 리터의 양) * S + Q(기본 요금)

📌 백만 장자 프로젝트 (1859)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    n = int(input())
    price = list(map(int, input().split()))
    profit = 0
    max_price = price[-1]

    for i in range(n - 2, -1, -1):
        if price[i] < max_price:
            profit += (max_price - price[i])
        else:
            max_price = price[i]

    print(f"#{test_case} {profit}")
  • 뒤에서부터 접근하는 것이 핵심🐥 앞에서부터 접근하면 시간 초과가 발생한다!
  • 뒤에서부터 매매가를 확인하여 max_price보다 작은 경우 profitmax_price와의 차이를 더하고, max_price보다 같거나 큰 경우 max_price 값을 업데이트해준다.

📌 간단한 369게임 (1926)

🔗 문제 링크

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

for i in range(1, n + 1):
    count = 0
    for w in word:
        if w in str(i):
            count += str(i).count(w)

    if count == 0:
		print(i, end=' ')
	else:
        print('-' * count, end=' ')
  • 숫자에 3, 6, 9가 들어가면 들어간 횟수만큼 -을 출력하고, 들어가지 않는다면 숫자를 출력한다.

📌 Base64 Decoder (1928)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    s = input()
    binary = ''
    answer = ''
    table = {"A": 0, "B": 1, "C": 2, "D": 3, "E": 4, "F": 5, "G": 6, "H": 7, "I": 8, "J": 9,
             "K": 10, "L": 11, "M": 12, "N": 13, "O": 14, "P": 15, "Q": 16, "R": 17, "S": 18, "T": 19,
             "U": 20, "V": 21, "W": 22, "X": 23, "Y": 24, "Z": 25, "a": 26, "b": 27, "c": 28, "d": 29,
             "e": 30, "f": 31, "g": 32, "h": 33, "i": 34, "j": 35, "k": 36, "l": 37, "m": 38, "n": 39,
             "o": 40, "p": 41, "q": 42, "r": 43, "s": 44, "t": 45, "u": 46, "v": 47, "w": 48, "x": 49,
             "y": 50, "z": 51, "0": 52, "1": 53, "2": 54, "3": 55, "4": 56, "5": 57, "6": 58, "7": 59,
             "8": 60, "9": 61, "+": 62, "/": 63}

	for i in s:
        binary += (bin(table[i])[2:]).zfill(6)

    for i in range(0, len(binary), 8):
        answer += chr(int(binary[i:i + 8], 2))
    print(f"#{test_case} {answer}")
  • 문자를 문제에서 주어진 표(table)를 참고하여 숫자로 변환하고, 이를 이진수로 변환한 뒤 십진수로 변환한다.

📌 가랏! RC카! (1940)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    n = int(input())
    speed = 0
    distance = 0

    for _ in range(n):
        command = input().split()

        if command[0] == '0':
            pass
        elif command[0] == '1':
            speed += int(command[1])
        else:
            speed = max(0, speed - int(command[1]))
        distance += speed

    print(f"#{test_case} {distance}")
  • command[0]
    • 0일 때는 현재 속도 유지이므로 별 다른 작업을 하지 않아도 된다.
    • 1일 때는 가속이므로 speedcommand[1]만큼 증가시킨다.
    • 2일 때는 감속이므로 speedcommand[1]만큼 감소시킨다. (감소시켰을 때 0보다 작아질 때는 0으로 한다고 했으므로 max()를 이용해준다.)
  • 매 초마다 speed만큼 distance를 더해준다.

📌 간단한 소인수분해 (1945)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    n = int(input())
    answer = [0, 0, 0, 0, 0]
    numbers = [2, 3, 5, 7, 11]

    for i in range(4, -1, -1):
        while n % numbers[i] == 0:
            answer[i] += 1
            n //= numbers[i]

    print(f"#{test_case}", end=' ')
    print(*answer)

📌 간단한 압축 풀기 (1946)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    n = int(input())
    docs = ''

    for _ in range(n):
        c, k = input().split()
        docs += c * int(k)

    print(f'#{test_case}')
    for i in range(0, len(docs), 10):
        print(docs[i:i+10])

📌 날짜 계산기 (1948)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    a, b, c, d = map(int, input().split())
    calendar = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    answer = d - b + 1
    for i in range(a, c):
        answer += calendar[i]

    print(f"#{test_case} {answer}")
  • 각 달의 마지막 날짜를 calendar에 모두 저장한다. (월 그대로 접근하기 위해서 맨 앞에 0을 추가해주었다.)
  • 먼저 d(두 번째 날짜의 일) - b(첫 번재 날짜의 일)answer로 설정한다.
  • ac 사이에 있는 모든 달의 날을 answer에 더해준다.

📌 달팽이 숫자 (1954)

🔗 문제 링크

T = int(input())

for test_case in range(1, T + 1):
    n = int(input())
    board = [[0] * n for _ in range(n)]

    num = 0
    y = 0
    x = -1
    size = n
    step = 1

    while size > 0:
        for _ in range(size):
            x += step
            num += 1
            board[y][x] = num
        size -= 1

        for _ in range(size):
            y += step
            num += 1
            board[y][x] = num
        step *= -1

    print(f"#{test_case}")
    for b in board:
        print(*b)

🔗 해설은 여기 참고

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글