카테고리 없음

solved.ac 마라톤 2주차

엔피디 2024. 8. 13. 16:13

사이트

solved.ac

 

solved.ac

알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.

solved.ac

 

마라톤

매주 티어(등급)에 따라 랜덤으로 문제 8개가 배정됩니다. 그 문제를 모두 완료하면 마라톤 성공! 문제를 완료할 때 마다 포인트를 지급 받고, 그 포인트를 통해 문제를 새로 고침 할 수 있습니다. 문제 해결을 통한 성취감과 주차별 목표를 통해 도전의식을 불러들여 매주 시도할 수 있을 것 같습니다.

이번 주 문제 풀이

사용 언어 : python

10170번 NFC West vs North

문제

동혁이를 위해 NFC 서부와 북부 디비전 순위를 출력하는 프로그램을 작성하시오.

코드

print("""NFC West       W   L  T
-----------------------
Seattle        13  3  0
San Francisco  12  4  0
Arizona        10  6  0
St. Louis      7   9  0

NFC North      W   L  T
-----------------------
Green Bay      8   7  1
Chicago        8   8  0
Detroit        7   9  0
Minnesota      5  10  1""")

여러 줄로 구성된 문자열의 경우 큰따옴표 3개(“””문장”””)로 작성하기 또는 작은따옴표 3개(’’’문장’’’)로 작성하는 방법이 있습니다.

21300번 Bottle Return

문제

생략

there is a 5¢ deposit for containers of any size less than one gallon containing beer, malt, wine products, carbonated soft drinks, seltzer and water (that does not contain sugar).

빈 용기를 가져오면 하나 당 5센트를 지급한다.

코드

containers = list(map(int, input().split()))

print(sum(containers)*5)

map 함수를 통해 여러 데이터를 리스트로 받고 sum 함수를 통해 전체 용기의 수를 구한 뒤 5를 곱하였습니다.

31450번 Everyone is a winner

문제

메달 수 M과 아이 수 K가 주어질 때 아이들에게 똑같은 갯수의 메달을 줄 수 있으면 Yes 다른 경우라면 No를 출력한다.

코드

M, K = map(int,input().split())

if M % K == 0:
    print("Yes")
else:
    print("No")

map 함수를 통해 M과 K의 입력을 동시에 받고 if 문을 통해 메달 수가 아이들 수로 나누어 떨어지는지 나누어 떨어지지 않는지 판별하여 알맞은 출력을 합니다.

28352번 10!

문제

10!초는 정확히 6주와 같다. 10!초는 1×2×3×⋯×9×10=3628800 = 3,628,800초이고, 6주도 7×6×24×60×60=3628800 = 3,628,800초이기 때문이다.

N!=1×2×3×⋯×N−1×N 초는 몇 주인지 구하는 프로그램을 작성해 보자.

코드

import math

N = int(input())

week = (3628800 // 6)

print(math.factorial(N) // week)

팩토리얼을 구하는 방법은 여러가지가 있습니다.

  1. 반복문
  2. 재귀함수
  3. math에 내장된 factorial 함수 사용

저는 3번 방법을 사용하였습니다.

 

먼저 math 라이브러리를 import 합니다.

 

팩토리얼을 계산할 정수 N을 입력으로 받습니다.

 

문제에서 주어진 6주의 초시간을 6으로 나눠 1주의 초시간을 week변수에 저장합니다.

 

팩토리얼 함수만 따로 불러온 것이 아니기에 사용할 함수 앞에 math를 붙여줘야 합니다. N!을 week로 나누어 N!이 몇 주인지 출력합니다.

25915번 연세여 사랑한다

문제

고려대학교 학생 훈규는 2022 정기 연고전에서 열심히 응원을 하다가 정신을 잃고 깨어나 보니 연세대학교의 감옥에 갇혀 있었다. 훈규가 감옥을 탈출하기 위해서는 바닥에 깔린 비밀번호 석판을 이용해서 비밀번호 "ILOVEYONSEI"를 입력해야 한다.

비밀번호 석판은 총 26가지의 석판이 일렬로 나열되어 있고, 각각 알파벳 대문자가 왼쪽부터 알파벳 순서대로 적혀 있다. 즉, i번째 석판에는 i번째 알파벳 대문자가 적혀 있다. 인접한 석판의 거리는 1이다. 따라서 A가 적힌 석판에서 출발해Z가 적힌 석판에 도착하기 위해서는 25의 거리를 이동해야 한다. 원하는 알파벳을 입력하려면 해당 알파벳이 적혀 있는 석판 위에 올라가 점프해야 한다. 점프는 0의 거리를 이동한다.

훈규가 현재 위치한 석판의 알파벳이 주어진다. 훈규는 최소로 이동해 비밀번호를 모두 입력하고자 한다.

코드

alphabet_list = [chr(i) for i in range(65, 91)]

c = input()

goal = c + "ILOVEYONSEI"
start = alphabet_list.index(c)

distance = 0

for i in range(1, len(goal), 1):
    start = alphabet_list.index(goal[i-1])
    distance += abs(alphabet_list.index(goal[i]) - start)

print(distance)

먼저 A부터 Z 까지 나열된 alphabet_list 라는 리스트를 만들었습니다.

 

입력값 c를 받고, c를 시작점으로 정하고 이 문제의 목표인 ILOVEYOUNSEI와 함께 goal 변수에 저장하였습니다.

 

이 상태에서 시작점인 c 알파벳이 위치한 인덱스와 그 다음 알파벳(I)가 위치한 인덱스의 거리를 비교하면서 distance 값에 저장합니다.

 

for문이 모두 돌면 필요한 거리를 출력할 수 있습니다.

28135번 Since 1973

문제

이에 기뻐한 선우는 어떤 수에 50이 들어가면 그 수를 한 번 더 세기로 하였다.

예를 들어 5152는 한 번만 세지만 5050이나 5051$은 한 번 더 센다.

선우의 방식대로 1부터 차례대로 수를 셀 경우, 몇 번째 수를 셀 때 N이 처음으로 등장하는지 구하여라. 선우의 방식대로라면 50은 50번째 수에서 처음 등장하지만, 51은 52번째 수에서 처음 등장한다.

출력

선우의 방식대로 1부터 차례대로 수를 셌을 때 어떤 수 N이 몇 번째 수에서 처음 등장하는지 출력하시오.

코드

N = int(input())

cnt = 0
for i in range(N):
    if str(i).find("50") > -1:
        cnt += 1

print(N + cnt)

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

 

cnt 변수를 0으로 초기화합니다.

 

0부터 N까지 for 문을 통해 str(i) 문자열 i 값에 50이 들어있는지 확인합니다. find 매소드를 통해 50이 들어있는 경우 50이 위치한 인덱스의 값을 리턴하며, 50이 들어있지 않은 경우 -1을 리턴하여 -1보다 큰 경우를 50이 위치한 경우로 의도하였습니다.

 

입력값 N과 한 번더 반복된 횟수인 cnt를 더하면 올바른 출력값을 구할 수 있습니다.