본문 바로가기
Study with Yedol/코딩테스트 준비

[python3] SWEA D2 문제풀이 | 1859. 백만 장자 프로젝트 외 8문제

by 예돌맨 2024. 5. 18.
반응형

 

#1859. 백만 장자 프로젝트

아이디어 : 마지막날을 max_money값으로 정한뒤 뒤에서부터 거꾸로 순회하면서 탐색한다.

T = int(input())

for tc in range(1, T+1):
    # 날짜 입력
    n = int(input())
    # 금액 입력
    money_list = list(map(int,input().split()))

    # 마지막일의 값을 최대값으로 설정
    max_money = money_list[-1]
    # 이익 변수 초기화
    profit = 0

    #마지막일부터 거꾸로 순회하면서 첫날까지 순회(최댓값 변경)
    for i in range(n-2, -1, -1):
        # 현재 매매가가 최대값보다 크면 최댓값 변경
        if money_list[i] >= max_money:
            max_money = money_list[i]

        # 현재 매매가가 최대값보다 크지 않다면 차익을 profit 저장
        else:
            profit += max_money - money_list[i]

    print('#{} {}'.format(tc,profit))

 

#1926. 간단한 369게임

입력 : 입력으로 정수 N 이 주어진다.

출력 : 1 ~ N까지의 숫자를 게임 규칙에 맞게 출력한다.

아이디어 : 숫자를 문자열로 변환하여 3,6,9 카운트

n = int(input())

for i in range(1, n+1):
    # n을 문자열로 변환
    num = str(i)
    count = 0

    for j in num:
        # 3,6,9 갯수 카운트
        if j in ('3','6','9'):
            count += 1

    if count > 0:
        print('-' * count, end=' ')
    else:
        print(num, end=' ')

 

#2007. 패턴 마디의 길이

패턴에서 반복되는 부분을 마디라고 부른다. 문자열을 입력 받아 마디의 길이를 출력하는 프로그램을 작성하라.

제약 사항 : 각 문자열의 길이는 30이다. 마디의 최대 길이는 10이다.

아이디어 : 마디의 최대 길이가 10이므로 for문으로 문자열을 하나하나 탐색한다. 

예를 들어 1~5번까지 문자열과 6~10(=5*2)번까지의 문자열이 같은지 탐색

T = int(input())

for tc in range(1, T+1):
    #알파벳 입력받기
    num = list(map(str, input()))

    #1번째 문자열부터 중복되는 문자열이 있는지 확인
    for i in range(1,11):
        if num[:i] == num[i:2*i]:
            print('#{} {}'.format(tc, i))
            break

 

#2005 : 파스칼의 삼각형

제약 사항 : 파스칼의 삼각형의 크기 N은 1 이상 10 이하의 정수이다. (1 ≤ N ≤ 10)

입력 : 가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.

각 테스트 케이스에는 N이 주어진다.

출력 : 각 줄은 '#t'로 시작하고, 다음 줄부터 파스칼의 삼각형을 출력한다.
삼각형 각 줄의 처음 숫자가 나오기 전까지의 빈 칸은 생략하고 숫자들 사이에는 한 칸의 빈칸을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

T = int(input())

for tc in range(1,T+1):
    # 각 테스트 케이스의 N 입력
    N = int(input())

    # 테스트 케이스 번호 출력
    print('#{}'.format(tc))
    answer= [] # 리스트 초기화

    for i in range(N):
        temp = []
        for j in range(i+1):
            if j == 0 or j == i: # 각 행의 첫 번째와 마지막 요소는 항상 1
                temp.append(1)
            else: #내부 요소는 윗줄의 왼쪽과 오른쪽 요소의 합
                temp.append(answer[i-1][j] + answer[i-1][j-1])
        # 현재 행을 삼각형에 추가
        answer.append(temp)
    
    #파스칼의 삼각형 출력
    for i in answer:
        print(*i)

 

#2001 : 파리 퇴치

입력 : 가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에 N 과 M 이 주어지고,
다음 N 줄에 걸쳐 N x N 배열이 주어진다.

출력 : 출력의 각 줄은 '#t'로 시작하고, 공백을 한 칸 둔 다음 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)

T = int(input())

for tc in range(1, T+1):
    n,m = map(int, input().split())
    # n * n 크기의 배열을 입력받아 grid에 저장
    grid = [list(map(int, input().split())) for i in range(n)]

    max_flies = 0

    # m*m 크기의 파리채로 잡을 수 있는 최대 파리 수 계산
    for i in range(n - m +1): #파리채가 위치할 수 있는 시작 행 인덱스 범위
        for j in range(n - m + 1): # 파리채가 위치할 수 있는 열 인덱스 범위
            current_flies = 0
            for x in range(m): # 파리채의 행 인덱스 범위
                for y in range(m): # 파리채의 열 인덱스 범위
                    current_flies += grid[i + x][j + y] #파리채 내의 각 위치에 있는 파리 수 합산
            if current_flies > max_flies:
                max_flies = current_flies
    # 각 테스트 케이스의 결과를 출력
    print('#{} {}'.format(tc, max_flies))

 

 

#1989. 초심자의 회문 검사

"level" 과 같이 거꾸로 읽어도 제대로 읽은 것과 같은 문장이나 낱말을 회문(回文, palindrome)이라 한다.
단어를 입력 받아 회문이면 1을 출력하고, 아니라면 0을 출력하는 프로그램을 작성하라.

T = int(input())

for tc in range(1, T+1):
    word = input()
    if word == word[::-1]:
        print('#{} {}'.format(tc,1))
    else:
        print('#{} {}'.format(tc,0))

 

#1986. 지그재그 숫자

1부터 N까지의 숫자에서 홀수는 더하고 짝수는 뺐을 때 최종 누적된 값을 구해보자.

T = int(input())

for tc in range(1, T+1):
    N = int(input())
    result = 0
    for i in range(1, N + 1):
        if i % 2 == 0:
            result -= i
        else:
            result += i
    print('#{} {}'.format(tc, result))

 

#1984. 중간 평균값 구하기

10개의 수를 입력 받아, 최대 수와 최소 수를 제외한 나머지의 평균값을 출력하는 프로그램을 작성하라.
(소수점 첫째 자리에서 반올림한 정수를 출력한다.)

T = int(input())

for tc in range(1, T+1):
    num = list(map(int, input().split()))

    num.sort()
    number = num[1:-1]
    '''
    혹은
    num.remove(num[0])
    num.remove(num[-1])
    '''

    avg = sum(number) / len(number)

    print('#{} {}'.format(tc, round(avg)))

 

# 1983.조교의 성적 매기기

아이디어 : K번째 학생의 점수를 계산하고, 점수를 가진 인덱스 번호 찾는다.

N/10명의 학생이 동일한 평점을 부여할 수 있으므로, (예를 들어 20명인 경우 2명씩 같은 점수를 부여하므로) 반드시 인덱스 번호를 찾을 때 n // 10으로 나눠준다.

T = int(input())  # 테스트 케이스의 개수
grades = ['A+', 'A0', 'A-', 'B+', 'B0', 'B-', 'C+', 'C0', 'C-', 'D0']

for tc in range(1, T + 1):
    N, K = map(int, input().split())  # 학생 수와 학점을 알고 싶은 학생의 번호 입력받기
    student_list = []  # 각 학생의 총점을 저장할 리스트 초기화

    # 각 학생의 총점 계산하여 리스트에 저장
    for _ in range(N):
        scores = list(map(int, input().split()))  # 중간, 기말, 과제 점수 입력받기
        total_score = 35 * scores[0] + 45 * scores[1] + 20 * scores[2]  # 총점 계산
        student_list.append(total_score)

    # K번 학생의 점수 저장
    k_student = student_list[K-1]

    # 내림차순 정렬
    student_list.sort(reverse=True)

    div = N//10 # 동일한 평점
    # K번 학생의 점수를 가진 인덱스 번호 찾기
    final_k_score = student_list.index(k_student) // div

    print('#{} {}'.format(tc, grades[final_k_score]))
반응형