카테고리 없음

solved.ac 마라톤 3주차

엔피디 2024. 8. 15. 18:54

사이트

solved.ac

이번 주 문제 풀이

사용 언어 : python

15000번 CAPS

문제 출처

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

문제

(생략)

The set of lower-case alphabetic characters is made up of the following characters: ’a’, ’b’, ’c’, ’d’, ’e’, ’f’, ’g’, ’h’, ’i’, ’j’, ’k’, ’l’, ’m’, ’n’, ’o’, ’p’, ’q’, ’r’, ’s’, ’t’, ’u’, ’v’, ’w’, ’x’, ’y’, ’z’.

Your job is to write a program that converts the given messages to upper-case.

소문자 알파벳으로 구성된 문자열을 대문자로 출력하라.

코드

s = input()

print(s.upper())

소문자 문자열을 입력 받고 출력 시 upper() 메소드를 붙여주어 대문자로 출력하도록 하였습니다.

28444번 HI-ARC=?

문제 출처

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

문제

HI-ARC 학회는 일상 속의 문장들을 수식으로 표현하는 것을 즐기는 특이한 문화를 가지고 있다.

HI-ARC 수식은 HI-ARC 학회에서 최근에 개발한 독특한 수식으로, 아래와 같은 규칙으로 계산한다.

  • H와 I의 곱이 첫 번째 항이다.
  • A와 R과 C의 곱이 두 번째 항이다.
  • 결과값은 첫 번째 항에서 두 번째 항을 뺀 값이다.

각각의 문자에 대응되는 숫자가 입력될 때, 결과값을 출력하자!

코드

H, I, A, R, C = map(int, input().split())

print(H*I - A*R*C)

map 함수를 통해 여러 데이터를 각 변수에 저장하고 문제에서 주어진 식으로 계산하였습니다.

27389번 Metronome

문제 출처

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

문제

A Metronome is a mechanical device used by musicians for keeping time. It is a very clever device, based on a spring, an inverted pendulum, and an escapement gear. Milo is learning to play the glockenspiel, and has purchased a metronome to help him keep time. Milo has noticed that for every complete turn (one revolution) of the key, the metronome will give four ticks. Milo wants the metronome to stop at the end of each song that he tries to play.

For a given song, how many revolutions must he wind the key?

코드

N = int(input())

print(N / 4)

정수를 입력 받고, 키를 완전히 돌릴 때마다 메트로놈이 4틱을 줄 것이기에 입력 받은 정수를 4로 나누면 됩니다.

5597번 과제 안 내신 분..?

문제 출처

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

문제

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다.

교수님이 내준 특별과제를 28명이 제출했는데, 그 중에서 제출 안 한 학생 2명의 출석번호를 구하는 프로그램을 작성하시오.

입력

입력은 총 28줄로 각 제출자(학생)의 출석번호 n(1 ≤ n ≤ 30)가 한 줄에 하나씩 주어진다. 출석번호에 중복은 없다.

코드

student_list = [i for i in range(1, 31, 1)]

for i in range(28):
    student_num = int(input())

    student_list.remove(student_num)

for num in student_list:
    print(num)

먼저 1부터 30번 까지 순차적으로 나열된 학생 번호 리스트(student_list)를 만듭니다.

28명만 과제를 제출하였으니 28번 반복합니다.

제출자의 학생 번호를 받을 때 마다 student_list에서 해당 학생의 번호를 remove를 통해 삭제합니다.

첫 번째 for문이 모두 돌은 뒤 student_list에 남은 학생은 과제를 제출하지 않은 학생으로 순차적으로 출력하면 됩니다. in list를 통해 리스트의 요소를 바로 꺼내어 출력하는 방법을 사용하였습니다.

2959번 거북이

문제 출처

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

문제

거북이는 이제 어떤 것에도 흥미를 느끼지 않는다. 그 이유는 거북이가 300년동안 살았고, 그 동안 모든 것들을 다 해보았기 때문이다. 거북이는 시간을 때우는 무엇인가를 하려고 한다. 이번 주말에 거북이는 거북이 세계에서 매우 유명한 게임인 "가장 큰 직사각형 만들기"를 해보려고 한다.

이 게임을 시작하기 전에 거북이는 양의 정수 네 개를 머릿 속에 생각해야 한다. 한 방향으로 움직이기 시작하고 90도 회전한 뒤에 새로운 방향으로 움직인다. 이런 식으로 세 번 90도 회전을 하고, 네 번 앞으로 움직여서 선분 네 개를 만들어야 한다.

거북이가 선분을 그릴 때 움직여야 하는 걸음의 수는 생각해 놓은 네 정수중 하나이다. 이때, 한 정수를 각각 한 번씩 사용해야 한다. 거북이가 정수를 사용하는 순서에 따라서 다양한 모양이 만들어진다. 어떤 모양에는 직사각형을 찾을 수 없기도 한다.

거북이가 만든 모양에서 찾을 수 있는 가장 큰 직사각형을 계산하는 프로그램을 작성하시오.

코드

# 이동 가능 거리 리스트로 저장
move_list = list(map(int, input().split()))

# 리스트 정렬
move_list.sort()

# 최댓값으로 직진
x1 = move_list[3]

# 90도 회전, 최솟값으로 직진
y1 = move_list[0]

# 90도 회전, 2번째로 큰 값으로 직진
x2 = move_list[2]

# 90도 회전, 2번재로 작은 값으로 직진
y2 = move_list[1]

print(y1*x2)

먼저 이동 가능한 거리인 4개의 정수를 리스트 형태로 저장하였습니다.

직사각형을 최대로 그리게 하는 규칙을 쉽게 적용하기 위해 리스트를 오름차순으로 정렬하였습니다.

규칙 설명:

  1. 먼저 최댓값으로 직선을 그린다.
  2. 90도 회전 후 최솟값으로 직선을 그린다.
  3. 90도 회전 후 두 번째로 큰 값으로 직선을 그린다.
  4. 90도 회전 후 두 번째로 작은 값으로 직선을 그린다.

여기서 2번째에서 최솟값으로 직선을 그리는 이유는 3번째 절차에서 최대한 다른 변의 길이를 크게 하면서 직사각형 형태를 그리게 하는 최소의 기준이기 때문입니다. 따라서 2번째로 그린 직선과 3번째로 그린 직선의 길이가 최대로 그릴 수 있는 직사각형의 가로와 세로의 길이가 됩니다.

y1과 x2를 곱하여 결과를 출력합니다.

3226번 전화 요금

문제 출처

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

문제

7:00부터 19:00까지 전화 요금은 1분에 10원이다.

19:00부터 7:00까지 전화 요금은 1분에 5원이다.

상근이가 전화를 건 시간과 통화 시간이 모두 주어졌을 때, 전화 요금을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 건 전화의 수 N이 주어진다. (1 ≤ N ≤ 100)

다음 N개 줄에는 상근이가 건 전화에 대한 정보가 HH:MM DD와 같은 형식으로 주어진다.

HH:MM은 전화를 건 시간이며, DD는 통화 시간이다. DD는 최대 60이며, MM과 DD사이에는 공백이 하나 주어진다.

만약 시나 분이 한자리 숫자라면, 앞에 0이 하나 주어진다.

시간은 00:00부터 23:59까지이다.

코드

# 하루 24시간 -> 1440분 7:00 -> 420분 19:00 -> 1140분 
N = int(input())

total = 0

cost_10, cost_5 = 0, 0

for i in range(N):
    HH_MM_DD = list(map(str, input().split()))
    HH_MM = HH_MM_DD[0].split(':')
    minute = int(HH_MM[0])*60 + int(HH_MM[1])
    DD = int(HH_MM_DD[1])

    if 1140 > minute + DD > 420:
        if minute > 420:
            cost_10 += DD
        else: 
            cost_10 += minute + DD - 420
            cost_5 += 420 - minute
    elif 1140 <= minute + DD:
        if minute >= 1140:
            cost_5 += DD
        else:
            cost_5 += minute + DD - 1140
            cost_10 += 1140 - minute
    elif minute + DD <= 420:
        cost_5 += DD
    
total = cost_5 * 5 + cost_10 * 10

print(total)

먼저 입력값(전화를 건 횟수 = for문을 도는 횟수)N을 받습니다.

total, cost_10(10원을 받는 전화시간, 단위 : 분), cost_5(5원을 받는 전화시간, 단위 : 분) 변수를 0으로 초기화해줍니다.

12:25 25 형태로 입력 값이 주어지는데, 각각을 분리하기 위해 우선 전체를 str형의 리스트로 만들고, 리스트에서 12:25를 인덱싱한 후 split 메소드를 통해 콜론(:)을 기준으로 나누어 HH_MM 변수에 저장하였습니다.

시간 계산을 편하게 하기 위해 시 단위를 분 단위로 통일하였습니다. HH_MM[0]은 시 단위이므로 60을 곱하여 전체 시간을 분을 기준으로 합니다.

현재 시각에서 DD분 만큼 전화를 이용하였을 때 경우의 수가 많습니다.

  1. 현재 시각 + 전화 이용 시간이 07시 초과 19시 미만 이면서, 현재 시각이 이미 07시를 넘었다면, 요금은 10원으로 변동 없습니다. 하지만 07시를 넘지 않았는데 전화 이용 시간이 길어져 07시를 넘겼다면 07시 이전의 요금은 5원, 이후의 요금은 10원으로 다르게 산정됩니다.
  2. 현재 시각 + 전화 이용 시간이 19시 이상이면서, 현재 시각이 이미 19시를 넘었다면, 요금은 5원으로 변동 없습니다. 하지만 19시를 넘지 않았는데 전화 이용 시간이 길어져 19시를 넘겼다면, 19시 이전의 요금은 10원, 이후의 요금은 5원으로 다르게 산정됩니다.
  3. 마지막으로 현재 시각 + 전화 이용 시간이 07시 이전이라면, 요금은 5원으로 변동 없습니다.

다음 경우의 수를 if문으로 구현하고 if문을 모두 돌면 10원 5원 각각의 요금으로 얼만큼 통화를 했는지 알 수 있습니다.

total에 총 요금을 할당하고 출력하면 문제를 해결할 수 있습니다.

13297번 Quick Estimates

문제 출처

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

문제

Let’s face it... you are not that handy. When you need to make a major home repair, you often need to hire someone to help. When they come for the first visit, they make an estimate of the cost. Here they must be careful: if they overestimate the cost, it might scare you off, but if they underestimate, the work might not be worth their time.

Because the worker is so careful, it can take a long time for them to produce the estimate. But that’s frustrating — when you ask for an estimate, you really are asking for the magnitude of the cost. Will this be $10 or $100 or $1 000? That’s all you really want to know on a first visit.

Please help the worker make the type of estimate you desire. Write a program that, given the worker’s estimate, reports just the magnitude of the cost — the number of digits needed to represent the estimate.

코드

N = int(input())

for i in range(N):
    num = input()
    print(len(num))

먼저 입력값 N을 받습니다.

문자열 형태로 숫자값을 받습니다.

수가 몇 자리로 이루어져 있는지 알기 위해 len()함수를 사용하여 출력합니다.