반응형

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

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

문제

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.


C = int(input())

for tc in range(C):
    score = list(map(int, input().split()))
    over_avg = 0

    avg = sum(score[1:])/score[0]

    for i in score[1:]:
        if i > avg:
            over_avg += 1

    ans = over_avg/score[0] * 100

    print('{:.3f}%'.format(ans))

가장 앞에 주어지는 테스트 수를 score에서 배제하기 위해 슬라이싱을 사용했다

test_case = int(input())

for i in range(test_case):
    score = input().split()
    score = map(int, score)
    score = list(score)

    ans_cnt = 0
    
    add = 0
    avg = 0
    cnt = 0

    for score_avg in range(1, len(score)):
        add += score[score_avg]
        cnt += 1
        avg = add/cnt
        
    for upper_avg in range(1, len(score)):
        if avg < score[upper_avg]:
            ans_cnt += 1
        
    ans = ans_cnt / cnt * 100

    print(f'{ans:.3f}%')

그리고 이건 약 한달쯤 전에 짰던 코드

이땐 테스트케이스를 뺄 때 for문을 1로 시작해줬다

sum 함수를 직접 짠 코드라 조금 길지만 사실 코드의 큰 차이는 없다.

반응형
반응형

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

 

8958번: OX퀴즈

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수

www.acmicpc.net

문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

출력

각 테스트 케이스마다 점수를 출력한다.


 

T = int(input())

for tc in range(T):
    ox = list(input())
    cnt = 0
    score = 0
    for i in range(len(ox)):

        if ox[i] == 'O':
            cnt += 1
            score += 1*cnt
        else:
            cnt = 0

    print(score)

 

반응형
반응형

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

 

1546번: 평균

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보

www.acmicpc.net

문제

세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.

예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.

세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보다 크다.

출력

첫째 줄에 새로운 평균을 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-2 이하이면 정답이다.


N = int(input())
score = list(map(int, input().split()))
max_num = 0
new_score = []

for i in range(N):
    if score[i] > max_num:
        max_num = score[i]
for i in score:
    new_score.append(i/max_num*100)

# 평균 구하기
add = 0

for i in new_score:
    add += i

print(add/N)

평균을 간단히 구하기 위해 sum 함수를 쓸 수도 있지만 직접 하나하나 더해줬다.

N = int(input())
score = list(map(int, input().split()))
max_num = 0
new_score = []

for i in range(N):
    if score[i] > max_num:
        max_num = score[i]
for i in score:
    new_score.append(i/max_num*100)

print(sum(new_score)/N)

sum 함수를 사용하면

print(sum(new_score)/N) 한 줄로 평균을 구할 수 있다.

반응형
반응형

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

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

문제

두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.

수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄부터 열번째 줄 까지 숫자가 한 줄에 하나씩 주어진다. 이 숫자는 1,000보다 작거나 같고, 음이 아닌 정수이다.

출력

첫째 줄에, 42로 나누었을 때, 서로 다른 나머지가 몇 개 있는지 출력한다.


arr = []

for tc in range(10):
    arr += [int(input())]

arr_2 = []

for i in arr:
    arr_2.append(i%42)

arr_3 = []

for i in arr_2:
    if not i in arr_3:
        arr_3.append(i)

print(len(arr_3))

배열을 3개나 사용했다...ㅎ

마지막 배열을 생각하는데 은근 시간이 걸렸는데

42 나머지 계산이 끝난 arr_2 배열의 값이 arr_3 배열에 없으면 추가 있으면 pass 하고

최종적으로 arr_3의 리스트 길이를 출력했다.

반응형
반응형

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

 

2577번: 숫자의 개수

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

www.acmicpc.net

문제

세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

입력

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

출력

첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.


A = int(input())
B = int(input())
C = int(input())

num = A * B * C
num = list(map(int,str(num)))

#카운팅 정렬 이용해보기
arr = [0] * 10

for i in range(len(num)):
    arr[num[i]] += 1
# print(arr) # 각 요소의 자리에 요소의 갯수를 더해준 값을 리스트화

# 한 줄에 하나씩 출력되도록
for i in arr:
    print(i)

카운팅 정렬 과정 중 일부를 이용하면 빠르게 정리할 수 있을 것 같아서 코드를 가져와서 이용했다

for i in range(len(num)):

    arr[num[i]] += 1

부분이 카운팅 정렬을 하기 위해 리스트의 숫자를 인덱스 숫자에 맞춰 요소의 갯수를 더해준 부분

2021.08.23 - [분류 전체보기] - [알고리즘] 카운팅정렬 이해하기

 

하나씩 받아온 숫자를 리스트화 하는 부분도 은근 헷갈렸다. 한번 정리 해봐야겠다.

반응형
반응형

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

 

2562번: 최댓값

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어

www.acmicpc.net

문제

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.


arr = []
max_num = 0
idx = 0

for tc in range(9):
    arr += [int(input())]

for i in range(len(arr)):
    if arr[i] > max_num:
        max_num = arr[i]
        idx = i
print(max_num)
print(idx+1)

max_num과 idx를 미리 선언해두고 리스트를 순환하며 앞에 저장된 수보다 크면 값을 바꿔가며

큰 값과 인덱스 값을 찾아주었다.

인덱스는 0부터 시작하기 때문에 +1 하여 출력하였다.

반응형
반응형

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

 

10818번: 최소, 최대

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

www.acmicpc.net

문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.


N = int(input())
num = list(map(int, input().split()))

print('{} {}'.format(min(num), max(num)))

내장함수 max min을 활용하여 빠르게 끝냈다

아래 코드는 버블소트를 이용해 풀어보려고 했는데 시간초과가 나왔다

버블소트가 아닌 다른 소트방식을 사용했다면 시간초과까지는 나오지 않았을 것 같지만... 그냥 내장 함수로 끝을 냈다.

N = int(input())
num = list(map(int, input().split()))

for i in range(N-1, -1, -1):
    for j in range(0, i):
        if num[j] > num[j+1]:
            num[j], num[j+1] = num[j+1], num[j]

print('{} {}'.format(num[0],num[-1]))

버블소트 사용한 코드,,, 시간초과

2021.08.22 - [분류 전체보기] - [알고리즘] 버블 정렬 이해하기_python

반응형
반응형

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

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력

첫째 줄에 N의 사이클 길이를 출력한다.


cnt = 0

new_num = int(input())
N = new_num

while True:
    if cnt > 0 and new_num == N:
        break
    else:
        second = new_num//10 + new_num % 10
        new_num = (new_num%10)*10 + (second%10)
        cnt += 1

print(cnt)

생각보다도 생각할게 많았던 문제,

문자열을 활용해서도 풀 수 있을 것 같다.

반응형
반응형

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

 

10951번: A+B - 4

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력

각 테스트 케이스마다 A+B를 출력한다.


while True:
    try:
        A, B = map(int, input().split())
        print(A + B)
    except:
        break
반응형
반응형

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

입력의 마지막에는 0 두 개가 들어온다.

출력

각 테스트 케이스마다 A+B를 출력한다.


while True:
    A, B = map(int, input().split())
    if A + B == 0:
        break
    print(A + B)

 

반응형

+ Recent posts