[python 기초] 백준: 1차원 배열 2 (8598,4344) / 배열, 리스트 내포 복습

EMMA·2022년 2월 16일
0

[python] 백준 시리즈

목록 보기
5/14
post-thumbnail

배열은 list만 안다고 해서 끝나는 문제가 아니었다...OTL

1차원 배열 문제들을 통해서 list()set() 활용하기라던가, list comprehension, 기타 list함수 등 좀 익숙해 졌다고 생각했다. 8598번과 4344번은 문법의 문제보다는, 해당 알고리즘을 구현하는 것이 핵심이었고 푸는데도 시간이 다소 걸렸다.

'대략 이런 로직이면 될 것 같은데...' 과 같이 rough하게만 접근하면 프로그램은 완성되지 않는다. 계속 생각하고 찾아보면서 처음부터 끝까지 명확하게 작성해야 한다.


#8958번

OX퀴즈에서 O는 득점이고 X는 0점이다. 그리고 각 O의 점수는 연속된 O의 개수만큼 적용된다. 예를 들어 "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
일단 각 O의 점수는 이전 문자가 O냐 X냐에 따라 결정된다. 이전 문자가 O라면 +1이 되고, X면 다시 O의 점수는 1부터 시작한다.

T = int(input())
answer = [input() for i in range(T)]	#T번만큼 answer[]를 받는다 

for i in range(len(answer)):
	total_score = 0		#최종 합산 점수  
	score = 0			#각 O의 점수 
    for j in range(len(answer[i])):
    	if answer[i][j] == "O":		#만약 O면 +1 
        	score += 1		
            total_score += score	#최종 합산 점수에 반영
        else:		
        	score = 0				#X면 다시 score는 0
    
    print(total_score)

그런데 여기서 total_score()=0score=0을 for문 바깥으로 보내면 오류다.

T=int(input())
answer = [input() for i in range(T)]

score = 0		
total_score = 0			
for i in range(len(answer)):
    for j in range(len(answer[i])):
        if answer[i][j] == "O":
            score += 1 
            total_score += score
        else:
            score = 0

    print(total_score)	#잘못된 값이 계산됨!!!

print(total_score)가 한번 실행되면 total_score는 0으로 리셋되고 2번째 입력값을 계산하는데, 위와 같이 작성하면 첫 번째 total_score를 그대로 가지고 if문을 수행하기 때문이다. 즉 total_score()=0score=0은 계산 초기화를 위해 존재한다. (처음에 이 단순한 로직을 찾아내는데 시간이 걸렸다...^^...)
정답)
OOXXOXXOOO -> 10 출력
OOXXOOXXOO -> 9 출력

오류)
OOXXOXXOOO -> 10 출력
OOXXOXXOOO + OOXXOOXXOO -> 통째로 인식, 25 출력


#4344번
케이스를 먼저 입력하고, 둘째 줄에는 학생 수, 학생 별 점수를 입력한다.
각 케이스마다 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
입력값에 학생 수와 점수가 같이 포함되어 있기 때문에, 이를 잘 계산해서 평균과 학생 비율을 각각 구하면 된다.

C = int(input()) 
for i in range(C):
	scores = list(map(int,input().split()))
    average = sum(scores[1:])/scores[0]		#점수끼리 합/학생 수
    cnt = 0 
    for score in scores:
    	if score > average:	cnt += 1
    
    print("%.3f%%" %(cnt/scores[0]*100))  

혹은, 학생 수를 scores.pop(0)으로 아예 분리시켜 작성해도 된다. pop()을 사용하면 해당 index의 값만 빼낼 수 있고 기존 list에는 해당값이 삭제된다.

C = int(input()) 
for i in range(C):
    scores = list(map(int,input().split()))
    n = scores.pop(0)	#scores[0] 빼고 scores[]에는 해당 값이 제외된다.
    average = sum(scores)/n
    cnt = 0 
    for score in scores:
        if score > average:
            cnt += 1      

    print("%.3f%%" %(cnt/n*100))




출처: 백준

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글