num = int(input())
for _ in range(num):
quiz = list(input())
result = 0
row = 0
for char in quiz:
if char == 'O':
row += 1
result += row
else:
row = 0
print(result)
문제
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.
설명
O가 나오면 일단 row를 1 증가시키고 그 row는 result에 넣는다. 이후, X가 나올 때까지는 row가 초기화되지 않으므로, O가 연속해서 등장할 때마다 row는 계속 증가한다. X가 나오면 row를 0으로 초기화 해준다.
한 줄에 대해 점수 분석을 완료했을 경우 다음 줄을 분석하기 전 result와 row는 초기화해야 한다. (result = 0, row = 0)
이 문제는 quiz 배열 안에서 for 반복문을 돌릴 수 있는 생각을 할 수 있는가가 상당히 중요하다.
필자도 처음에는 다음과 같이 작성했었다.
for i in range(num):
...
for j in range(len(quiz)):
...
하지만 ChatGPT가 조금 수정해주었다. 수정한 버전이 더 직관적이라고 생각된다. 물론, 마지막에 보여줄 "다른 사람의 관점" 코너에도 이와 같이 len을 이용해서 range를 해준 사람도 있다.
또 조건을 다음과 같이 설정했었다.
if quiz[j] == 'O':
result += 1
if row == 0:
break
else:
row += 1
result += row
if quiz[j] == 'X':
row = 0
너무 복잡하다.
간단하게 row가 0이든 아니든 사실 일단 row를 1증가시키고 그 row를 result에 넣으면 되는데,
일단 result에 1을 더하고 row가 0인지 아닌지에 따라 추가로 row를 1 더하고 그것을 result에 더하려고 했다.
직관적으로 하려다보니 이런 상황이 발생하는데.. 코드 작성보다 알고리즘에 더 많은 시간을 들여야 한다는 것이
이런 비효율적인 코드를 없애기 위함이다.
다른 사람의 관점
결과값을 한번에 출력하기
M = int(input())
a =[]
for i in range(M):
N = input()
total = 0
temp = 0
for n in N:
if n == 'O':
temp+=1
total+=temp
else:
temp = 0
a.append(total)
for v in a:
print(v)
기본적으로 같지만, 이 사람은 결과가 나올 때마다 a 배열에 그 결과를 저장하고,
나중에 a 배열 안에 있는 v를 한꺼번에 출력했다. 나는 결과가 나올 때마다 출력했으므로 출력 방식이 다르다.
간소화 왕
for _ in range(int(input())):
s=input()
c=0;g=0
for i in s:
if i=='O':
c+=1
g+=c
else:
c=0
print(g)
기본적으로 같다. 하지만 정말 짧게 간소화를 잘 해줬다.
relay_count = 1로 시작! 먼저 result에 적용하고 가중치부여하기
time = int(input())
relay_count = 1
total = 0
for i in range(time):
total = 0
relay_count = 1
dab = input()
for a in range(len(dab)):
if dab[a] == "O":
total += relay_count
relay_count += 1
else:
relay_count = 1
print(total)
내가 row를 처음에 0으로 설정하고, 1을 올린 뒤 result에 적용했다면,
이 사람은 먼저 relay_count(row)를 1로 설정하고 일단 total(result)에 적용하고 카운트를 올렸다.
X나온 경우인 else도 1로 초기화를 시켜줬다.
'중간 난이도 문제 > Python (파이썬)' 카테고리의 다른 글
[Python3/백준11720] (공백없는) 숫자의 합 - 리스트(배열)의 이용 (0) | 2024.05.25 |
---|