본문 바로가기

코딩테스트 준비 with Python/내가 보려고 정리하는 문풀

정다면체

두 개의 정 N면체와 정 M면체의 주사위를 던져서 나올 수 있는 눈의 합 중 가장 확률이 높은 숫자를 출력하는 프로그램 작성

숫자가 여러개일 경우 오름차순으로 출력

 

입력예시)

4 6

출력예시)

5 6 7


내가 처음에 쓴 코드

N, M = map(int, input().split())
sumLst = []

for i in range(1,N+1):
    for j in range(1,M+1):
        sumLst.append(i + j)

cntLst = []
for x in sumLst:
    cntLst.append(sumLst.count(x))
maxCnt = max(cntLst)

result = set()
for x in sumLst:
    if sumLst.count(x) == maxCnt:
        result.add(x)

result = list(result)
result.sort()
for x in result:
    print(x, end=' ')

코드설명)

우선 N,M을 입력받고


두 눈의 합의 모든 경우의 수를 리스트 sumLst에 넣음 (중복 있음)


sumLst에 있는 각 합의 빈도수를 또다른 리스트 cntLst에 넣음
cntLst에서 최댓값을 찾아 maxCnt에 저장하고


다시 sumLst에서 maxCnt값과 같은 count 값을 가진 숫자들을
result set에 넣음(중복제거)
result를 set에서 list로 변환하여 정렬한 뒤


result의 원소들을 출력한다.


 

모범답안

n, m = map(int, input().split())
cnt = [0]*(n+m+1)
max = -2147000000

for i in range(1, n+1):
    for j in range(1, m+1):
        cnt[i+j] += 1

for i in range(n+m+1):
    if cnt[i] > max:
        max = cnt[i]

for i in range(n+m+1):
    if cnt[i] == max:
        print(i, end=' ')

코드설명)

먼저 N,M을 입력받고
인덱스 번호가 합을 나타내는 (따라서 합의 최댓값이 N+M임을 고려하면 리스트의 len은 N+M+1이어야함)
최대빈도수 max를 가장 작은 값으로 설정

N+M의 경우의 수를 전부 반복문으로 돌면서
각 합에 해당하면 그 인덱스 원소에 +1

cnt에서 최댓값 구하기 (max로 바로 구할 수도 있음)

cnt리스트 돌면서 max와 일치하는 인덱스(합) 바로 출력

 


모범답안 리뷰 전 접근 방식만 활용하여 다시 작성해본 코드

N, M = map(int, input().split())
cnt = [0]*(N+M+1)

for i in range(1, N+1):
    for j in range(1, M+1):
        cnt[i+j] += 1

cntMax = max(cnt)
result = set()
for i in range(len(cnt)):
    if cnt[i] == cntMax:
        result.add(i)

result = list(result)
result.sort()
for x in result:
    print(x, end=' ')

모범답안 리뷰 후 반성

 

1. 접근 방식이 아예 달랐음. 틀리고 맞은건 없겠지만 내가 처음에 한 방식은
너무 쓸데없는 부분이 많았던 것 같다.. 인덱스 자체를 합으로 생각하여 cnt 리스트 하나로 해결을
하는 생각은 왜 못했을까!!?

2. 1번 개념을 반영하여 내가 작성해본 코드에도 불필요한 부분이 너무 많다.
우선 최종결과를 출력하기 위해 result set을 만들고, 중복을 제거하고, 다시 리스트로 바꾸고,
정렬하고, 또다시 반복문을 이용해 출력하는 방법은 너무 초딩같았다.
하지만? 하다보면 발전하겠지 ㅋ

3. 합 자체를 인덱스로 사용하고, 결과 출력까지도 따로 집합이나 리스트를 만들지 않고
해결한 부분은 꼭 기억하장.


반성 후 내가 다시. 작성해본 코드

N, M = map(int, input().split())

cnt = [0]*(N+M+1)

for i in range(1, N+1):
    for j in range(1, M+1):
        cnt[i+j] += 1

maxCnt = max(cnt)

for i in range(len(cnt)):
    if cnt[i] == maxCnt:
        print(i, end=' ')

 

'코딩테스트 준비 with Python > 내가 보려고 정리하는 문풀' 카테고리의 다른 글

소수 (에라토스테네스의 체)  (2) 2024.06.08
자릿수의 합  (2) 2024.06.08
대표값  (0) 2024.06.06
K번째 큰 수  (0) 2024.06.06
K번째 수  (0) 2024.06.06