[プログラマー]Lv1ジャージ


[プログラマー]
Lv.1ジャージ
1.質問input学生数/運動服のない学生指数/性別のある学生指数output体育服のある学生合計(体育服はindexを前後に借りるしかない)
2.解答
この問題をリストで解決しようとしましたが、実行時にエラーが発生しました.
問題をよく読んでいないので、お金がたくさんありますが、盗まれたくない症例です.
3.コード
マイコード
def solution(n, lost, reserve):
    student = []
    i = 0
    while i < n:
        if i+1 in lost:
            student.append(0)
        elif i+1 in reserve:
            student.append(2)
        else:
            student.append(1)
        i += 1
    answer = 0
    if student[0] == 0 and student[1] == 2:
        student[0] = 1
        student[1] = 1
    if student[-1] == 0 and student[-2] == 2:
        student[-1] == 1
        student[-2] == 1  
    for i in range(len(student)):
        if student[i] == 0:
            if student[i-1] == 2:
                answer += 1
                student[i-1] = 1
            elif student[i+1] == 2:
                answer += 1
                student[i+1] = 1
        else:
            answer += 1
    return answer
最適コード1
def solution(n, lost, reserve):
    reserve_set = set(reserve)-set(lost) 
    lost_set = set(lost)-set(reserve)ㅡ
    for reserve_person in reserve_set: 
        if reserve_person-1 in lost_set: 
            lost_set.remove(reserve_person-1) 
        elif reserve_person+1 in lost_set: 
            lost_set.remove(reserve_person+1) 
    return n-len(lost_set)
最適コード2
def solution(n, lost, reserve):
    _reserve = [r for r in reserve if r not in lost]
    _lost = [l for l in lost if l not in reserve]
    for r in _reserve:
        f = r - 1
        b = r + 1
        if f in _lost:
            _lost.remove(f)
        elif b in _lost:
            _lost.remove(b)
    return n - len(_lost)
最適コード3
def solution(n, lost, reserve):
    answer = 0
    for k in range n:
    	i = k+1
        if i not in lost: #안 잃어버린 학생
            answer += 1
        else:
            if i in reserve: #잃어버렸지만 여분도 있는 학생
                answer += 1
                reserve.remove(i)
                lost.remove(i)
    for i in lost: #잃어버리고 여분도 없어서 빌려야 하는 학생
        if i-1 in reserve:
            answer += 1
            reserve.remove(i-1)
        elif i+1 in reserve:
            answer +=1
            reserve.remove(i+1)
    return answer
反省する

  • <最適コード1>
    まずreserveとlossの重複インデックスを削除するために,差分セットを用いて分離する.
    その後、reserve setのインデックス+-loss setに値がある場合は、loss setから削除します(他の操作が可能であるため).
    全生徒数(n)から、これ以上余罰を受けられない生徒数を減算する.

  • <最適コード2>
    代替setはfor文listによってreserveとlossの重複を除去する.

  • <最適コード3>
    私の答えと似ていますが、ここではリストを単独で作成するのではなく、inputの値を使用しています.