[ 6092 ] 코드업 6092 : 이상한 출석부
< 문제 >
선생님이 학생들의 이름을 외우기 위해 무작위 출석부를 부른다. 각 학생들이 몇 번 불렸는지 알려주는 프로그램을 작성해라.
< 문제 푸는 방법 >
- 1 ~ 23 사이에 있는 정수가 입력되었는지 확인하는 프로그램이다.
=> 1차원 리스트로 student[1] = y : 1번 학생이 y번 불렸다.
< 코드 1 > for 문 이용
num = int(input()) # 반복횟수
a = list(map(int, input().split())) #이상한 출석부 입력받기
student = [0]*23 # 0으로 채워진 리스트
for i in range(num):
student[a[i]-1] += 1
print (" ".join(repr(i) for i in student)) # student list 출력
📌 student [ a[i]-1 ] += 1
- 리스트는 0 부터 시작합니다. ( 시작 인덱스 = 0 )
=> student 라는 리스트가 있을 때, 0번에 1번 학생의 정보가 들어가고, student[22]에 23번의 학생이 들어가게 됩니다.
=> i = 3 일 때, 1번 학생의 출석을 불렀다고 가정하면, a[3] = 1 이므로, student[ a[i]-1 ] = student[0] 이 됩니다.
따라서 이름이 불릴 때 마다 횟수가 늘어나는 코드가 됩니다.
< 코드 2 > 조금 더 직관적인 코드 (?)
num = int(input())
a = list(map(int, input().split()))
student = [0]*23
for i in a: #a는 반복가능한 형태
student[i-1] += 1
print (" ".join(repr(i) for i in student))
📌 a는 반복 가능한 형태이므로 range 가 아닌 in으로 사용하여 바로 탐색가능합니다.
✏️ student 가 문자열이 아닌 정수형으로 이루어져 있는 형태이므로, repr(정수 -> 문자열)로 바꾼 후 join함수를 사용합니다.
< 코드 3 > count 함수 사용
num = int(input())
a = list(map(int, input().split()))
student = [0]*23
for i in a:
student[i-1] = a.count(i) # count 함수 사용
print (' '.join(repr(i) for i in student))
📌 list의 내장함수 count는 찾고자 하는 원소의 개수를 세어 반환해주는 함수입니다.
- for 문을 통해 출석부 부른 순으로 탐색합니다.
- count 함수를 통해 부른 횟수를 student[i-1]에 저장하고, 그 결과를 출력하면 됩니다.
✏️ 실행시간도 오래 걸리며, 불필요한 계산과정이 많아 좋은 방법은 아니라고 생각합니다.
a가 1 3 2 2 5 5 2 3 5 9 일 때, 1, 2, 3, 5, 9 총 5번의 count 함수로 결과값을 알 수 있으나, 실제로 10번 모두 호출됩니다..
밑에 사진 보시면 실행시간이 1926입니다... (코드 3, 코드 2, 코드 1 순서)
+ zest1923.tistory.com/38?category=852295 join, repr 언급 부분