본문 바로가기
중간 난이도 문제/Python (파이썬)

[Python3/백준8958] OX퀴즈 - 리스트 안에서의 for 반복문

by 이트스타-백준 2024. 5. 25.
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로 초기화를 시켜줬다.