한강에서 호기롭게 2인 코딩을 시도했으나

둘이서 팔다리를 웰던으로 익히고 카페로 도망쳤다.

 

아직도 팔이 따가워..

 



1546 - 평균

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

문제

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

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

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

입력

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

출력

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


그 정성으로 공부를 해 세준아..

 

- 맞힌 코드 -

1
2
3
4
5
6
7
8
9
10
= int(input())                        #과목의 개수를 입력한다.
score = list(map(int,input().split()))  #과목별 점수를 score에 리스트로 저장한다.
 
score.sort(reverse=True)                #과목별 점수를 내림차순으로 정리한다.
score_max = score[0]
 
for i in range(0, N):                   #과목들을 조작한다.
    score[i] = (score[i] / score_max) * 100
    
print(sum(score)/len(score))            #평균을 출력한다.
cs

판다스에서 사용하던 ascending이랑 reverse랑 헷갈려서 절었었다.

list로 감싸지 않고 map으로 처리한 상태로 내비두면 map인 상태로 있다. (리스트 X)



8958 - OX 퀴즈

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

문제

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

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

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

입력

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

 

출력

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


- 맞힌 코드 -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
= int(input())    #테스트 케이스를 입력받는다.
 
streak = 0          #연속 정답변수 선언
ox_score = 0        #점수 총합변수 선언
 
for _ in range(T):  #케이스 갯수만큼 반복한다.
    ox_q = input()  #입력 받은 문제를 ox_q로 선언한다.
    
    for i in range(len(ox_q)):  
        if ox_q[i] == 'O':  #해당 문제의 O를 쭉 훑는다.
            streak += 1     #O를 (연속으로) 만날 때 마다 1점씩 추가된다.
            ox_score += streak  #그 때마다 스코어에 저장한다.
        else:
            streak = 0  #X를 만난다면 연속점수를 초기화한다.
            
    print(ox_score) #점수의 총합을 프린트한다.
    ox_score = 0
    streak = 0  #나머지 변수를 초기화한다.
cs

리스트에 할당해서 split을 이용해서 O 묶음 들을 일일히 처리하고

+

n까지의 합 함수 정의해서 for문으로 돌리려고 생각하고 있었는데,

굳이 그럴 필요가 없고 그냥 문자열로 처리하면 되는 것 아니냐는 말에 바로 수긍했다.

 

마지막에 streak 초기화를 안 해줘서 절었었다..



4344 - 평균은 넘겠지

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

문제

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

입력

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

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

출력

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


- 맞힌 코드 -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
= int(input())    #케이스 개수를 입력한다.
 
score_lst = []  #앞으로 쓸 변수를 선언한다.
score_mean = 0
score_meanstu = 0
 
for i in range(C):  #케이스 갯수만큼 score_lst에 케이스(리스트)를 저장한다.
    score_lst = list(map(int,input().split()))          
    score_mean = sum(score_lst[1:])/(len(score_lst)-1)  #첫번째 항은 계산에 필요가 없으므로 슬라이싱 + 한개 빼서 평균을 계산한다.
    
    for i in range(1len(score_lst)):  #만약 저장된 리스트의 값들 중 평균 값을 초과하는 것(학생)이 있다면 stu_meanstu에 카운트한다.
        if score_lst[i] > score_mean:
            score_meanstu += 1
    answer = (round(((score_meanstu) / (len(score_lst)-1)) * 1003))   #평균을 초과하는 학생들의 비율을 계산해서 answer에 입력한다(소수점 표기 때문에)
    
    print(f'{answer:.3f}''%', sep=''#소수점 세자리까지 출력한다.
    
    score_lst = []  #변수들을 초기화해준다.
    score_mean = 0
    score_meanstu = 0
cs

.pop()을 이용했으면 더 깨끗하게 나왔을 것 같다는 피드백을 받았다.

차근차근 깔끔하게 만들어 봐야지..


다이나믹 프로그래밍 공부하고 있길래, 옆에서 어깨너머로 보고 있었다.

둘 다 코드가 어떻게 굴러가는 건지 왜 이렇게 짠 건지 생각해봤는데

이해는 하겠지만 이렇게 짜라고 하면 못 짤 것 같다고 얘기했다.

딱 기다려~

 

 

 

 

4번 테마의 7번째까지 총 41개 풀었어.

앞으로 344개의 문제가 남았어. (10.6%)

복사했습니다!