관리 메뉴

솜씨좋은장씨

[BaekJoon] 2506번 : 점수계산 (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 2506번 : 점수계산 (Python)

솜씨좋은장씨 2022. 6. 21. 11:35
728x90
반응형

코딩 1일 1문제! 오늘의 문제는 백준의 점수계산 입니다.

 

2506번: 점수계산

OX 문제는 맞거나 틀린 두 경우의 답을 가지는 문제를 말한다. 여러 개의 OX 문제로 만들어진 시험에서 연속적으로 답을 맞히는 경우에는 가산점을 주기 위해서 다음과 같이 점수 계산을 하기로

www.acmicpc.net

👨🏻‍💻 문제 풀이

이 문제는 연속적으로 답을 맞춘 경우를 고려하여 점수를 계산하는 문제입니다.

저는 이 문제를

문자열을 특정한 단어로 나누는 split 과

누적합을 구하는 itertools의 accumulate를 활용하여 문제를 풀었습니다.

N = int(input())
score_list = input().split()

먼저 총 문제의 개수 N 과

문제를 맞췄는지 안맞췄는지 정보를 담은 문자열을 입력 받습니다.

score_str = score_str.replace(" ", "")

문제를 맞췄는지 안맞췄는지정보를 담은 문자열에서 공백을 없애줍니다.

"1 0 1 1 1 0 0 1 1 0"
-> "1011100110"

그 다음 연속된 점수일때 얻을 수 있는 점수 목록을 accumulate로 구해줍니다.

accumulate_list = get_accumulate_list(N)

만약 N이 10이라고 하면

list(accumulate(range(10)))
-> [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

위와 같이 누적합 리스트가 만들어집니다.

score_str.split("0")
-> ['1', '111', '', '11', '']

여기서 score_str를 0으로 나누면 연속으로 맞춘 부분들이 나옵니다.

score_list = [accumulate_list[len(score)-1] for score in score_str.split("0") if len(score) != 0]

이제 누적합과 위에서 만든 연속으로 맞춘 부분들의 길이를 활용하여 맞춘 부분들의 점수를 구한다음

[1, 6, 3]

이 리스트의 합을 구하면 정답입니다.

👨🏻‍💻 코드 ( Solution )

from itertools import accumulate


def get_accumulate_list(N):
    return list(accumulate(range(1, N+1)))


def calculate_score(score_str, N):
    score_str = score_str.replace(" ", "")
    
    accumulate_list = get_accumulate_list(N)
    
    score_list = [accumulate_list[len(score)-1] for score in score_str.split("0") if len(score) != 0]
    
    return sum(score_list)
    

if __name__ == "__main__":
    N = int(input())
    score_str = input()
    
    print(calculate_score(score_str, N))
 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments