고교학점제는 학생들이 자신의 진로와 적성에 맞는 다양한 과목을 선택하고, 학점을 취득해 졸업하는 제도입니다. 2025년 전면 도입을 목표로 현재 단계적으로 시행되고 있습니다.
주요특징:
학점 기준: 졸업을 위해 학생들은 총 192학점을 이수해야 하며, 이는 공통과목과 선택과목을 포함합니다. 공통과목에는 국어, 수학, 영어가 있으며, 최소 학업 성취 수준을 보장하기 위해 이들 과목의 성취율이 40% 미만인 경우 보충 지도가 이루어집니다.
과목 선택: 학생들은 2학년부터 자신의 진로에 맞는 과목을 선택할 수 있습니다. 선택 과목은 일반선택과 진로선택으로 나뉘며, 대학 입시와 연계하여 선택하는 것이 중요합니다. 예를 들어, 이공계열 진학을 목표로 하는 학생은 수학과 과학 관련 심화 과목을 선택하는 것이 유리합니다.
학생 맞춤형 교육: 학생 개개인의 학습 필요와 진로에 맞춘 맞춤형 교육을 제공합니다. 이를 위해 교사들은 다양한 수업 방법과 평가 방식을 도입해야 합니다.
진로 지도 강화: 학생들이 자신의 진로를 설계하고 준비할 수 있도록 진로 교육과 상담을 강화합니다.
목표
자기주도적 학습 능력 함양: 학생들이 스스로 학습 계획을 세우고 실행할 수 있는 능력을 키웁니다.
다양성 존중: 학생들이 각자의 흥미와 재능에 따라 다양한 과목을 공부할 수 있도록 함으로써 교육의 다양성을 증진합니다.
미래 사회 대비: 변화하는 사회와 직업 세계에 대비하여 학생들이 필요한 역량을 갖추도록 지원합니다.
교육 기회의 공평성: 모든 학생이 자신의 적성과 진로에 맞는 교육을 받을 수 있도록 교육 기회의 공평성을 보장합니다.
장점
학생들이 자신의 흥미와 적성에 맞는 과목을 선택할 수 있어 학습 동기와 성취도를 높일 수 있습니다.
다양한 과목을 통해 폭넓은 지식을 습득하고, 진로에 맞는 전문성을 기를 수 있습니다.
학점제를 통해 학생들의 학습 성과를 체계적으로 관리하고 평가할 수 있습니다.
단점 및 과제
교육 현장에서의 교사 부족 및 인프라 미비: 다양한 과목을 개설하고 운영할 수 있는 교사와 시설이 부족할 수 있습니다.
학생과 학부모의 준비 부족: 학생과 학부모가 고교학점제에 대한 충분한 이해와 준비가 필요합니다.
평가 방식의 변화 필요: 기존의 획일적인 평가 방식에서 벗어나 다양한 평가 방법이 요구됩니다.
고교학점제는 학생들이 미래 사회에 대비할 수 있는 능력을 기르고, 자신의 적성과 흥미를 반영한 학습을 할 수 있도록 돕는 중요한 교육 개혁입니다. 이를 성공적으로 구현하기 위해서는 교육계의 전반적인 협력과 준비가 필요합니다.
고교 내신 9등급 -> 5등급 으로 변화
고교 내신 5등급제: 2025년부터 고교 내신 평가는 5등급제(A~E)로 바뀐다. 각 등급별 비율은 1등급(10%)-2등급(24%, 누적34%)-3등급(32%, 누적66%)-4등급(24%, 누적90%)-5등급(10%) 등이다.
이때 시간초과로 인한 실패가 많은데 해결하기 위해서는 더이상 플레이어가 없을때(n==0)는 계산 없이 바로 실패율을 0으로 만든다.
def solution(N, stages):
answer = []
n = len(stages)
for i in range(N):
if n==0:#플레이어가 없을때 계산없이 0으로 추가함
answer.append(0)
else:
c = stages.count(i+1)
answer.append(c/n)
n -= c
answer = sorted(range(1,N+1), key=lambda k: answer[k-1], reverse=True)
return answer
실행결과
테스트 1 〉
통과 (0.01ms, 9.99MB)
테스트 2 〉
통과 (0.26ms, 10.1MB)
테스트 3 〉
통과 (80.91ms, 10.2MB)
테스트 4 〉
통과 (434.18ms, 10.7MB)
테스트 5 〉
통과 (1687.00ms, 15.1MB)
테스트 6 〉
통과 (0.83ms, 10.4MB)
테스트 7 〉
통과 (11.96ms, 10.3MB)
테스트 8 〉
통과 (385.14ms, 10.8MB)
테스트 9 〉
통과 (1593.72ms, 14.9MB)
테스트 10 〉
통과 (149.76ms, 10.9MB)
테스트 11 〉
통과 (444.06ms, 10.8MB)
테스트 12 〉
통과 (450.53ms, 11.1MB)
테스트 13 〉
통과 (514.34ms, 11.3MB)
테스트 14 〉
통과 (0.04ms, 10.1MB)
테스트 15 〉
통과 (13.92ms, 10.7MB)
테스트 16 〉
통과 (5.73ms, 10.4MB)
테스트 17 〉
통과 (17.65ms, 10.5MB)
테스트 18 〉
통과 (6.00ms, 10.3MB)
테스트 19 〉
통과 (1.26ms, 10.2MB)
테스트 20 〉
통과 (20.84ms, 10.4MB)
테스트 21 〉
통과 (18.46ms, 10.8MB)
테스트 22 〉
통과 (1373.85ms, 18.3MB)
테스트 23 〉
통과 (10.45ms, 11.6MB)
테스트 24 〉
통과 (62.01ms, 11.6MB)
테스트 25 〉
통과 (0.01ms, 10.2MB)
테스트 26 〉
통과 (0.01ms, 10.1MB)
테스트 27 〉
통과 (0.01ms, 10.1MB)
테스트 3, 4, 8, 9 등 몇몇 테스트의 경우 큰 시간이 필요하다. 그래서 좀 더 효율적으로 시간을 줄이기 위해서 아래와 같이 count() 함수를 사용하지 않고 미리 계산된 결과만 불러오도록 수정하였다.
def solution(N, stages):
answer = []
n = len(stages)
temp =[0]*N #count 를 미리 계산
for v in stages:
if v<=N:
temp[v-1] += 1
for i in range(N):
if n==0:
answer.append(0)
else:
c = temp[i] # count 값만 호출함
answer.append(c/n)
n -= c
answer = sorted(range(1,N+1), key=lambda k: answer[k-1], reverse=True)#리스트 인덱스 정렬
return answer
실행결과: 아래와 같이 시간이 많이 단축됨을 확인할 수 있다.
테스트 1 〉
통과 (0.01ms, 10.1MB)
테스트 2 〉
통과 (0.18ms, 10.1MB)
테스트 3 〉
통과 (1.14ms, 10.3MB)
테스트 4 〉
통과 (9.74ms, 10.8MB)
테스트 5 〉
통과 (20.49ms, 14.8MB)
테스트 6 〉
통과 (0.12ms, 10.3MB)
테스트 7 〉
통과 (0.84ms, 10.3MB)
테스트 8 〉
통과 (9.54ms, 10.8MB)
테스트 9 〉
통과 (20.53ms, 15MB)
테스트 10 〉
통과 (10.58ms, 10.8MB)
테스트 11 〉
통과 (9.36ms, 10.9MB)
테스트 12 〉
통과 (14.67ms, 11.3MB)
테스트 13 〉
통과 (20.32ms, 11.3MB)
테스트 14 〉
통과 (0.02ms, 10.2MB)
테스트 15 〉
통과 (4.08ms, 10.5MB)
테스트 16 〉
통과 (3.23ms, 10.3MB)
테스트 17 〉
통과 (6.43ms, 10.4MB)
테스트 18 〉
통과 (3.26ms, 10.4MB)
테스트 19 〉
통과 (0.64ms, 10.2MB)
테스트 20 〉
통과 (5.68ms, 10.3MB)
테스트 21 〉
통과 (19.67ms, 10.8MB)
테스트 22 〉
통과 (21.01ms, 18.3MB)
테스트 23 〉
통과 (19.02ms, 11.7MB)
테스트 24 〉
통과 (18.49ms, 11.6MB)
테스트 25 〉
통과 (0.01ms, 10.1MB)
테스트 26 〉
통과 (0.01ms, 10.1MB)
테스트 27 〉
통과 (0.01ms, 10.1MB)
dictionary가 list 보다 데이터 접근이 빠르다고 하여 아래와같이 answer 타입을 list 에서 dictionary 로 변경하여 속도를 확인하였다.
def solution(N, stages):
answer = {}
n = len(stages)
temp =[0]*N
for v in stages:
if v<=N:
temp[v-1] += 1
for i in range(N):
if n==0:
answer[i+1]= 0
else:
c = temp[i]
answer[i+1]= c/n
n -= c
answer = sorted(answer, key=lambda k: answer[k], reverse=True)
return answer
실행결과: 처리 과정은 저장후 정렬이 대부분이며, 저장된 데이터를 찾는 경우가 작다. 그래서 아래와 같이 결과가 비슷하거나 데이터에 따라 약간 차이가 있음을 확인할 수 있다.
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.
2. 입출력 예
nums
result
[1,2,3,4]
1
[1,2,7,6,4]
4
입출력 예 설명
입출력 예 #1 [1,2,4]를 이용해서 7을 만들 수 있습니다.
입출력 예 #2 [1,2,4]를 이용해서 7을 만들 수 있습니다. [1,4,6]을 이용해서 11을 만들 수 있습니다. [2,4,7]을 이용해서 13을 만들 수 있습니다. [4,6,7]을 이용해서 17을 만들 수 있습니다.
3. 문제 풀이
서로 다른 3개를 골라야 되기 때문에 3중 for 문을 쓰던 combinations를 import 시켜서 조합을 만들어내야된다.
작성된 코드 설명은 다음과 같다
(1) 코드는 단순하게 3중 for 문을 써서 조합을 만들다.
(2) 조합중 2,3 으로 나누어 떨어지는 수들을 먼저 제외시킨다.
(3) 나머지 수들 중 1을 제외한 홀수로 나누어 떨어짐을 검사해서 소수를 찾음
def solution(nums):
answer = 0
l = len(nums)
for i in range(l-2):
for j in range(i+1,l-1):
for q in range(j+1,l):
s = nums[i]+nums[j]+nums[q]
if s%2==0 or s%3==0:
continue
else:
prime = True
for r in range(3,int(s**0.5)+1,2):
if s%r==0:
prime = False
break
if prime:
answer += 1
return answer