728x90
반응형

8958번 문제

#1 내방식

import sys
import random

while True:
    print("몇번 반복하실껀가요? " , end = ' ')
    TestCase = int(sys.stdin.readline())
    if TestCase<0 or TestCase>80:
        print("테스트케이스 값 다시 입력하세요.")
    else:
        break
for i in range(TestCase):
    midscore = 1
    finscore = 0
    b =1
    OX = ['O','X']
    OX = OX*random.randrange(3,10)
    random.shuffle(OX)
    #print("len(OX) - 1 = {} ".format(len(OX)-1))
    for j in range(0,len(OX)-1):
        if OX[j] == 'O' : #'O'가있다면
            if OX[j+1] == 'O' : #뒤인덱스에 'O'가있다면
                b+=1 #연속횟수 1더하기
                midscore+=(1*b) #임시저장소에 (1*연속횟수)값 더하기
                if j==(len(OX)-2):
                    finscore+=midscore
        if OX[j+1] == 'X': #뒤에 인덱스가'X'라면
            if b>=2: #임시저장소가 한번의 연속성을 가졌다면 뭐 b>=2 이렇게 해도 될듯
                finscore += midscore #최종저장소에 임시저장소값 더하기
            midscore =1 #임시저장소값 1로 초기화
            b =1 #연속횟수값 1로 초기화
        else:
            continue
    print(OX)
    print("점수계산 : ",finscore)

Random 함수를 사용하여 풀어보았다.

★★★★1. random.randomrange(3,6) ===> 3부터 5까지의 수의 랜덤으로 추출

            2. random.shuffle(객체) ===> 객체의 값들을 섞어준다! 

 

18번째줄 range(0,len(OX) -1) ===> len(ox) -1 을 한 이유 : OX[j+1] 값을 처리할때 len(ox)로 하면 범위가 넘어가게 된다.

23번째줄 if문 ==> j == (len(ox) - 2) 한 이유 : 인덱스의 경우 길이보다 하나 작은 값으로 생각해야 한다. len(OX)-2 의 인덱스는 뒤에서 두번째를 의미한다. j값이 뒤에서 두번째의 인덱스 순서가 왔을때 뒤에서 두번째와 마지막이 'O'일경우 for문을 종료해주고 finscore에 저장값을 저장해야 하므로 이렇게 설정했다.

25번째줄  OX[j+1] == 'X' ==> 23번째줄과 비슷하게 'X'가 나오면 반복문을 중지 시켜야한다. 

26번째줄 if문을 통해 연속횟수가 2회이상일경우 finscore에 중간값을 더하기하여 저장시키고 minscore와 연속횟수의미하는 b값을 1로 초기화 시켜준다.

 

#2 내방식_2 (SPLIT 함수 활용)

import sys
import copy
chul = []
while True:
    TestCase = int(sys.stdin.readline())
    if TestCase < 0 or TestCase > 80:
        print("테스트케이스 값 다시 입력하세요.")
    else:
        for i in range(TestCase):
            midscore = 1
            finscore = 0
            b = 1
            OX_3 = []
            OX = list((sys.stdin.readline().split('X'))) #'X'로 분류
            OX_2 = copy.deepcopy(OX) #OX_2에 OX 복사
            while '' in OX_2: #'X'로 분류를 했기때문에 빈 요소로 출력되는 부분이 있다.
                #이를 ''이 OX_2에 있을때까지 반복한다.
                OX_2.remove('') #OX_2리스트에서 빈 요소 ''를 삭제한다.
            print("OX_2 리스트 : " , OX_2)
            for k in range(len(OX_2)): #이제 OX_2리스트의 길이만큼 반복
                OX_3.append(OX_2[k].count(str('O'))) #'O'가 몇개있는지 COUNT하여 OX_3리스트에 추가한다.
            print("OX_3 리스트('X'이전의 'O'의 갯수 정리해놓은 리스트) : " , OX_3)
            for p in range(len(OX_3)): #OX_3 리스트의 길이만큼 반복
                midscore = 1
                b=1
                if OX_3[p]>=1: #OX_3의 요소는 X가 나오면 분류해놓은 곳에서 
                    for q in range(int(OX_3[p])-1): #중요!!!!!!!!!!! : 'O'개수의 이전까지의 RANGE 설정!!!
                        #왜냐하면 midscore를 애초에 1로 설정했기 때문
                        b+=1
                        midscore += (1*b)
                    finscore+= midscore
            chul.append(finscore)
        break
for i in range(len(chul)):
    print("점수 계산 : " ,chul[i])

#3 구글링 방식(객체에 List 저장하기)

import sys
import random

while True:
    print("몇번 반복하실껀가요? " , end = ' ')
    TestCase = int(sys.stdin.readline())
    if TestCase<0 or TestCase>80:
        print("테스트케이스 값 다시 입력하세요.")
    else:
        break
for i in range(TestCase):
    midscore = 1
    finscore = 0
    b =1
    OX = ['O','X']
    OX = OX*random.randrange(3,10)
    random.shuffle(OX)
    #print("len(OX) - 1 = {} ".format(len(OX)-1))
    for j in range(0,len(OX)-1):
        if OX[j] == 'O' : #'O'가있다면
            if OX[j+1] == 'O' : #뒤인덱스에 'O'가있다면
                b+=1 #연속횟수 1더하기
                midscore+=(1*b) #임시저장소에 (1*연속횟수)값 더하기
                if j==(len(OX)-2):
                    finscore+=midscore
        if OX[j+1] == 'X': #뒤에 인덱스가'X'라면
            if b>=2: #임시저장소가 한번의 연속성을 가졌다면 뭐 b>=2 이렇게 해도 될듯
                finscore += midscore #최종저장소에 임시저장소값 더하기
            midscore =1 #임시저장소값 1로 초기화
            b =1 #연속횟수값 1로 초기화
        else:
            continue
    print(OX)
    print("점수계산 : ",finscore)
728x90
반응형

+ Recent posts