티스토리 뷰

Code/BackJoon

백준 8958번: OX퀴즈 [Python]

Tree._.River 2022. 1. 25. 23:58

8958

 

8958번: OX퀴즈

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

www.acmicpc.net

 

내가 작성한 코드

N = int(input())

quize = []
result = []

for i in range(N):
    quize = input()
    result.append(list(quize))

for i in range(N):
    sum = 0
    score = 0
    for j in range(0, len(result[i])):
        if result[i][j] == 'O' and result[i][j-1] == 'O':
            score += 1
            sum += score
        elif result[i][j] == 'O':
            score = 1
            sum += score
        elif result[i][j] == 'X':
            score = 0
    print(sum)

*풀이

- 첫 접근 방식
   1. 연속된 O 일 경우를 체크한다.

   2. 연속된 O의 경우 score는 1씩 증가한다.

   3. 연속된 O의 경우 총 점수를 더해준다.

   4. X의 경우 score를 0으로 초기화한다.

 

- 접근 방식의 문제점

  1. 연속된 O 일 경우를 체크한다. 

      ㄴ 연속된 값임을 확인하기 위해서 이전 값과 현재 값을 비교해야 한다고 생각했다.

          result[i][j] == 'O' and result[i][j-1] == 'O'

      ㄴ 비교할 필요가 없고 'O'일 때 score 증가만 해주면 간단하다. 'X'일 경우 score = 0으로 초기화만 해주면 해결된다.

          if j == 'O':
            score += 1
            sum += score
          elif j == 'X':
            score = 0

  2. 이미 입력값이 문자열이므로 입력값을 list로 변경할 이유가 없다. 새로운 배열에 입력값을 append할 필요가 없다.

          result.append(list(quize)) => 삭제

  4. 이중 반복문의 범위 체크

      ㄴ 반복문의 범위를 result 배열의 길이만큼 반복하면 된다고 생각했다.

          for j in range(0, len(result[i])):

      ㄴ 범위 지정없이 파이썬의 전형적인 반복문으로 해결된다.

          for j in quize:

 

*짧은 코드

N = int(input())

for i in range(N):
    quize = input()

    sum = 0
    score = 0
    
    for j in quize:
        if j == 'O':
            score += 1
            sum += score
        elif j == 'X':
            score = 0
    print(sum)

*느낀점

- 코드길이는 320B가 줄었지만 메모리는 똑같고 시간은 오히려 처음 작성한 코드가 더 빨랐다.

- 메모리와 가독성 모두를 잡을 수 있도록 노력해야겠다.

댓글