알고리즘

[알고리즘] 순위

scone 2022. 5. 14. 16:12

[순위]

  • 수의 크고 작음을 이용해 수의 순서를 정하는 것을 순위라고 한다.

 

  • for문을 두번 돌리면 된다.
  • 하나의 숫자에 대해 나머지 숫자들과 전부 비교하여 순위를 구하고
  • 이를 모든 숫자에 대해 마찬가지로 반복한다.
import random

numbers = random.sample(range(50,101),20)
rank = [0 for _ in range(20)]

for idx,num1 in enumerate(numbers):
    for num2 in numbers:
        if num1 < num2 :
            rank[idx] += 1

print(f'numbers : {numbers}')
print(f'rank : {rank}')

for idx, num in  enumerate(numbers):
    print(f'num : {num}\t서열 {rank[idx]+1}위 입니다.')
'''
numbers : [69, 58, 86, 60, 73, 59, 75, 77, 70, 57, 96, 98, 62, 83, 71, 65, 89, 64, 51, 67]
rank : [10, 17, 3, 15, 7, 16, 6, 5, 9, 18, 1, 0, 14, 4, 8, 12, 2, 13, 19, 11]
num : 69        서열 11위 입니다.
num : 58        서열 18위 입니다.
num : 86        서열 4위 입니다.
num : 60        서열 16위 입니다.
num : 73        서열 8위 입니다.
num : 59        서열 17위 입니다.
num : 75        서열 7위 입니다.
num : 77        서열 6위 입니다.
num : 70        서열 10위 입니다.
num : 57        서열 19위 입니다.
num : 96        서열 2위 입니다.
num : 98        서열 1위 입니다.
num : 62        서열 15위 입니다.
num : 83        서열 5위 입니다.
num : 71        서열 9위 입니다.
num : 65        서열 13위 입니다.
num : 89        서열 3위 입니다.
num : 64        서열 14위 입니다.
num : 51        서열 20위 입니다.
num : 67        서열 12위 입니다.
'''

[실습] 학급 학생의 기말고사 성적을 이용해서 각각의 순위를 구하고, 중간고사 대비 기말고사  순위 편차를 출력하여보자. (시험 성적은 난수를 이용한다. )

import random

class RankDevi:
    def __init__(self, mid_score, final_score):
        self.mid_score = mid_score
        self.final_score = final_score
        self.mid_rank = [0 for _ in range(20)]
        self.final_rank = [0 for _ in range(20)]
        self.rank_deviation = [0 for _ in range(20)]
    
    def set_rank(self, scorelist, rank):
        for idx,num1 in enumerate(scorelist):
            for num2 in scorelist:
                if num1 > num2:
                    rank[idx] += 1 
    
    def set_mid_rank(self):
        self.set_rank(self.mid_score,self.mid_rank)

    def set_final_rank(self):
        self.set_rank(self.final_score,self.final_rank)

    
    def Rank_deviation(self):
        for i in range(20):
            if self.mid_rank[i] > self.final_rank[i] :
                self.rank_deviation[i] = '↑'+str(self.mid_rank[i]-self.final_rank[i])
            elif self.mid_rank[i] < self.final_rank[i] :
                self.rank_deviation[i] = '↓'+str(self.final_rank[i]-self.mid_rank[i])
            else:
                self.rank_deviation[i] = '='

mid_score = random.sample(range(1,101),20)
final_score = random.sample(range(1,101),20)

rank_list = RankDevi(mid_score,final_score)
rank_list.set_mid_rank()
print(f'mid_score : {mid_score}\n rank : {rank_list.mid_rank}')
rank_list.set_final_rank()
print(f'final_score : {final_score}\n rank : {rank_list.final_rank}')
rank_list.Rank_deviation()

for i in range(20):
    print(f'mid_rank:{rank_list.mid_rank[i]}\tfinal_rank:{rank_list.final_rank[i]}\tDeviation:{rank_list.rank_deviation[i]}')
'''
mid_score : [53, 36, 47, 38, 16, 43, 28, 6, 83, 60, 42, 4, 82, 59, 3, 61, 89, 98, 99, 2]
 rank : [11, 6, 10, 7, 4, 9, 5, 3, 16, 13, 8, 2, 15, 12, 1, 14, 17, 18, 19, 0]
final_score : [39, 70, 29, 3, 61, 66, 46, 21, 76, 40, 72, 10, 22, 19, 87, 75, 44, 100, 53, 43]
 rank : [6, 14, 5, 0, 12, 13, 10, 3, 17, 7, 15, 1, 4, 2, 18, 16, 9, 19, 11, 8]
mid_rank:11     final_rank:6    Deviation:↑5
mid_rank:6      final_rank:14   Deviation:↓8
mid_rank:10     final_rank:5    Deviation:↑5
mid_rank:7      final_rank:0    Deviation:↑7
mid_rank:4      final_rank:12   Deviation:↓8
mid_rank:9      final_rank:13   Deviation:↓4
mid_rank:5      final_rank:10   Deviation:↓5
mid_rank:3      final_rank:3    Deviation:=
mid_rank:16     final_rank:17   Deviation:↓1
mid_rank:13     final_rank:7    Deviation:↑6
mid_rank:8      final_rank:15   Deviation:↓7
mid_rank:2      final_rank:1    Deviation:↑1
mid_rank:15     final_rank:4    Deviation:↑11
mid_rank:12     final_rank:2    Deviation:↑10
mid_rank:1      final_rank:18   Deviation:↓17
mid_rank:14     final_rank:16   Deviation:↓2
mid_rank:17     final_rank:9    Deviation:↑8
mid_rank:18     final_rank:19   Deviation:↓1
mid_rank:19     final_rank:11   Deviation:↑8
mid_rank:0      final_rank:8    Deviation:↓8
'''

 

class 연습 겸 하게 되었는데

변수명이 좀 길다보니 오타가 계속 발생해 시간이 좀 많이 오래걸렸다.