Algorithm

[1일 3알고리즘] Day5

  • -
728x90

1. 모의고사

이 문제는 원래 아래와 같이 시도했었다.

def solution(answers):
    ans = []
    scoreDic = {}
    scoreDic.update({1: math1(answers)})
    scoreDic.update({2: math2(answers)})
    scoreDic.update({3: math3(answers)})

    scoreDic = sorted(scoreDic.items(), key=lambda item: item[1], reverse=True)

    highest_score = scoreDic[0][1]

    for key, value in scoreDic:
        if value == highest_score:
            ans.append(key)
        else:
            break

    return ans


def math1(ans):
    cnt = 0
    i = 0
    for j in range(1, len(ans)):
        if ans[i] == j:
            cnt += 1
        i += 1
    return cnt


def math2(ans):
    cnt = 0
    mathAns = []
    for i in range(len(ans)):
        if i % 2 == 0:
            mathAns.append(2)
        else:
            mathAns.append((i // 2) + 1)

    for i in range(len(ans)):
        if ans[i] == mathAns[i]:
            cnt += 1
    return cnt


def math3(ans):
    cnt = 0
    mathAns = []
    for i in range(len(ans)):
        if i < 2:  
            mathAns.append(3)
        else:
            mathAns.append((i - 2) // 2 + 1)

    for j in range(len(ans)):
        if ans[j] == mathAns[j]:
            cnt += 1
    return cnt

그런데 채점을 돌려보니, 몇개의 tc가 제대로 동작하지 않았다. 아마 1 2 3학생의 답안을 만드는 과정에서 문제가 있었을 것 같다.

def solution(answers):
    ans = []
    scoreDic = {}
    scoreDic.update({1: math1(answers)})
    scoreDic.update({2: math2(answers)})
    scoreDic.update({3: math3(answers)})

    # 점수를 내림차순으로 정렬
    scoreDic = sorted(scoreDic.items(), key=lambda item: item[1], reverse=True)

    # 가장 높은 점수
    highest_score = scoreDic[0][1]

    # 가장 높은 점수를 얻은 사람 찾기
    for key, value in scoreDic:
        if value == highest_score:
            ans.append(key)
        else:
            break

    return ans

def math1(answers):
    pattern = [1, 2, 3, 4, 5]
    return sum(1 for i, ans in enumerate(answers) if ans == pattern[i % len(pattern)])

def math2(answers):
    pattern = [2, 1, 2, 3, 2, 4, 2, 5]
    return sum(1 for i, ans in enumerate(answers) if ans == pattern[i % len(pattern)])

def math3(answers):
    pattern = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    return sum(1 for i, ans in enumerate(answers) if ans == pattern[i % len(pattern)])

위 풀이는 도저히 해결 방법을 모르겠어서 지피티의 도움을 받은 부분인데, 지피티가 제안해 준 방식이 원래 내가 원하던 방식(= 배열을 만들고 문제 수 많큼 답을 만드는 것)과도 유사해서 이를 더 공부해야겠다.

 

2. 소수 만들기 (RE)

이 문제는 나중에 다시 풀 계획이다. 아래는 솔루션 중 combination을 사용한 사례이고, 나는 이 문제가 BFS인줄 알았다...  라이브러리를 쓸 생각도 못해서, 꼭 다시 풀 예정이다.

def solution(nums):
    from itertools import combinations as cb
    answer = 0
    for a in cb(nums, 3):
        cand = sum(a)
        for j in range(2, cand):
            if cand%j==0:
                break
        else:
            answer += 1
    return answer

 

 

3. 실패율

https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

def solution(N, stages):

    persent = []
    ans = []
    for num in range(1, N+1):
        fail = 0
        success = 0
        for i in range(len(stages)):
            if stages[i] == num:
                fail += 1
            elif stages[i] > num:
                success += 1
        if fail == 0:
            persent.append((num, 0))
        else:
            persent.append((num, fail / (fail + success), 2))

    persent = sorted(persent, key=lambda x:x[1], reverse=True)
    for i in range(len(persent)):
        ans.append(persent[i][0])
    return ans

처음엔 위와 같이 시도했는데, 3개의 tc에서 시간초과가 났다.

def solution(N, stages):
    cnt = [0 for i in range(600)]
    persent = []
    ans = []
    challenger = len(stages)

    for i in range(len(stages)):
        cnt[stages[i]] += 1

    for i in range(1, N + 1):
        if challenger != 0:
            fail = cnt[i]
            persent.append((i, fail / challenger))
            challenger -= fail
        else:
            persent.append((i, 0))

    persent = sorted(persent, key=lambda x:x[1], reverse=True)
    for i in range(len(persent)):
        ans.append(persent[i][0])
    return ans

다음과 같이 이중 for문을 없애는 방안으로 변경하여 해결!

'Algorithm' 카테고리의 다른 글

[1일 3알고리즘] Day7  (0) 2024.04.21
[1일 3알고리즘] Day6  (0) 2024.04.18
[1일 3알고리즘] Day4  (0) 2024.04.16
[1일 3알고리즘] Day3  (0) 2024.04.15
[1일 3알고리즘] Day2  (0) 2024.04.12
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.