https://www.acmicpc.net/problem/8958
문제
"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함수와 사용 방법은 동일하나, 함수의 결과가 참인지 거짓인지에 따라, 해당 요소를 포함할지를 결정합니다.
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라고 지정된다니...
상상만해도 유용하다.
'sw사관학교 정글 2기 > 01 기초,재귀,완전탐색, 정렬' 카테고리의 다른 글
[기초-배열] 백준 2577번 숫자의 개수 with Python3 (0) | 2021.08.07 |
---|---|
[기초-배열] ★백준 4344번 평균은 넘겠지 with Python3 (0) | 2021.08.07 |
[기초-배열] 백준 2562번 -최댓값- with.Python3 (0) | 2021.08.07 |
[기초-반복문] 백준 10871번 -X보다 작은 수- with.Python3 (0) | 2021.08.07 |
[기초-반복문] 백준 2438번 -별 찍기 - 1- with.Python3 (0) | 2021.08.07 |
댓글