본문 바로가기
  • 초부득3 - 어제보다 나은 내일을 위해
  • 꿈이 현실이 되는 날까지
sw사관학교 정글 2기/01 기초,재귀,완전탐색, 정렬

[기초-배열] ★백준 8958번 -OX퀴즈- with.Python3

by 금의야행 2021. 8. 7.

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

 

8958번: OX퀴즈

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

www.acmicpc.net

문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다. OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

내 풀이 -비효율

n = int(input())

for _ in range(n):
    c = list(filter(None, input().split('X')))
    #i = 0 있었지만 필요없는 코드. 이때까지만해도 i가 0에서 시작안할까 두려웠다.
    result = 0
    for i in range(len(c)):
        b2 = 0
        b3 = 0
        for _ in range(len(c[i])):
            b2 = b2+1
            b3 = b3 + b2
        result += b3
    print(result)

해설

골좀 깨진문제.

c에 OO O OOO 이런식으로 O를 담은다음, 그것의 개수만큼 1 + (n+1) 해주는 코드. 

여기선 이상하게 b 2 = b2+1/ b3 = b3 + b2 라는 식으로 적었다.

 

filter()

filter함수는 특정 조건으로 걸러서 걸러진 요소들로 iterator객체를 만들어서 리턴해줍니다.

map함수와 사용 방법은 동일하나, 함수의 결과가 참인지 거짓인지에 따라, 해당 요소를 포함할지를 결정합니다.

https://wikidocs.net/22803

target = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def is_even(n):
    return True if n % 2 == 0 else False

result = filter(is_even, target)

print(list(result))

#함수를 재사용할 이유가 없다면, 보다 간결하게 lambda를 통하여 그리고, 
#0이 거짓, 그 외에 숫자는 참으로 취급받는 특성을 이용하여 다음과 같이 축약할 수 있습니다.

target = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = filter(lambda x : x%2==0, target)
print(list(result))

 

 

c = list(filter(None, input().split('X')))

X를 기준으로 split 할때 생기는 None value들을 바로 Filter을 통해 정리해줬다. 

 

이런거 쓴줄도 몰랐는데 기억해야겠다. 

 

정답 풀이

n = int(input())

for _ in range(n):
    ox_list = list(input())
    score = 0  
    sum_score = 0  # 새로운 ox리스트를 입력 받으면 점수 합계를 리셋한다.
    for ox in ox_list:
        if ox == 'O':
            score += 1  # 'O'가 연속되면 점수가 1점씩 커진다.
            sum_score += score  # sum_score = sum_score + score
        else:
            score = 0
    print(sum_score)

출처:https://ooyoung.tistory.com/61

 

해석

for문으로 O나 X 문자를 하나씩 꺼내서 ox라는 변수에 선언하고 if조건식을 이용해서 O가 연달아 나오는 경우 점수가 1씩 증가하도록 하였다.

 

★별표사항

이 부분이 너무 신기하다. ox를 따로 선언안하고, for문에서 선언하면 자동으로 ox가 ox_list안의 element라고 지정된다니...

상상만해도 유용하다.

댓글