Computer Science/자료구조

[6.6] 프로그래머스 코딩테스트 연습 - 체육복 (4/100)

토마토. 2021. 6. 6. 14:10

코딩테스트 연습 - 체육복 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

이렇게 문제 풀이 구상을 한다. 

#번호는 체격순. 앞번호, 뒷번호에게만 빌려줄 수 있다. 
# n : 전체 학생 수
# lost : 도난당한 학생의 배열
# reserve : 여벌 있는 번호

# 전체 학생 수 2 ~ 30
# lost 1 ~ n (중복 번호 없음)
# 여벌 1 ~ n (중복 번호 없음)
# 여벌 + lost인 경우, 빌려줄 수 없음

# step 1. 제한사항 정리하기
# 2 <= n <= 30
# 1 <= len(lost) <= n
# 1 <= reserve <= n

# step 2. 그 다음은 어떻게 해야하지? 
# 수업 들을 수 있는 사람 : n - lost
# for i in lost:
# lost의 앞뒤 or 본인 번호가 reserve에 있으면, answer += 1 랑 donelst.append(번호) / relst.append(reserve 번호)
# 이때 중복되면 안된다. if i in donelst or j in relst: print('error') 하기

# 헷갈리는 것 : i-1, i, i+1 셋 중에 하나가 reserve에 있어야 다음으로 넘어갈 수 있다. 
# 그 다음에 셋 중 하나를 k에 할당하여 다음 작업을 해주어야 한다. 
# 셋 중 하나 결정하는 걸 어떻게 하지? 

왜 틀렸는지 모르겠다;;

def solution(n, lost, reserve):
    m = len(lost)
    r = len(reserve)
    answer = n - m
    donelst = []
    relst = []

    if 2<=n<=30 and 1<= m <= n and 1<=r<=n:
      for i in lost:
        if lost.count(i) == 1:
          for k in range(i-1, i+2):
            if k in reserve:
              if reserve.count(k) == 1:
              # 얘가 체육복을 빌려줄 것이다. 
                if i not in donelst and k not in relst:
                  donelst.append(i)
                  relst.append(k)
                  answer += 1
                  break
              else:
                return 'error'
        
            else:
              pass
        else:
          return 'error'
    
    else:
      return 'error'
    return answer

print(solution(3, [3],	[1]))

    return answer

끙 - 왜자꾸 2개씩 틀리는지 모르겠다. 

def solution(n, lost, reserve):
  m = len(lost)
  r = len(reserve)
  answer = n - m
  donelst = []
  relst = []

  if 2<= n<= 30 and 1<= m<=n and 1<=r<=n:
    for i in lost:
      if lost.count(i) == 1:
        pass
      else:
        return 'error'
    for j in reserve:
      if reserve.count(j) == 1:
        pass
      else:
        return 'error'
  else:
    return 'error'

  for i in lost:
    for k in range(i-1, i+2):
      if k in reserve:
        if i not in donelst and k not in relst:
          donelst.append(i)
          relst.append(k)
          answer += 1
          break
        else:
          pass
  return answer

solution ...

def solution(n, lost, reserve):
  set_reserve=set(reserve) - set(lost)
  set_lost = set(lost) - set(reserve)
  for i in set_reserve:
    if i-1 in set_lost:
      set_lost.remove(i-1)
    elif i+1 in set_lost:
      set_lost.remove(i+1)
  return n-len(set_lost)

정답이래도 다른 사람 코드 꼭 봐야겠다