Number of Students Unable to Eat Lunch

제로콜라좋아요·2024년 6월 22일
0

algorithem

목록 보기
33/37

문제설명

학교 식당에서는 점심 시간에 원형과 사각형 샌드위치를 제공합니다. 이 샌드위치는 각각 숫자 0과 1로 나타냅니다. 모든 학생들은 줄을 서서 각자 원형 또는 사각형 샌드위치를 선호합니다.

식당의 샌드위치 수는 학생 수와 같습니다. 샌드위치는 스택에 쌓여 있습니다. 각 단계에서:

1.	만약 줄의 맨 앞 학생이 스택 맨 위의 샌드위치를 선호하면, 그 학생은 샌드위치를 가져가고 줄에서 나갑니다.
2.	그렇지 않으면, 그 학생은 샌드위치를 남겨두고 줄의 끝으로 이동합니다.

이 과정은 줄의 학생들이 더 이상 스택 맨 위의 샌드위치를 가져가지 않을 때까지 계속됩니다.

두 개의 정수 배열 students와 sandwiches가 주어집니다. 여기서 sandwiches[i]는 스택의 i번째 샌드위치 종류(위에서부터 아래로), students[j]는 초기 줄에서 j번째 학생의 선호도를 나타냅니다. 먹을 수 없는 학생 수를 반환하세요.

예시 1:

•	입력: students = [1,1,0,0], sandwiches = [0,1,0,1]
•	출력: 0
•	설명:
•	앞 학생이 맨 위의 샌드위치를 남기고 줄 끝으로 이동하여 학생들이 [1,0,0,1]이 됩니다.
•	앞 학생이 맨 위의 샌드위치를 남기고 줄 끝으로 이동하여 학생들이 [0,0,1,1]이 됩니다.
•	앞 학생이 맨 위의 샌드위치를 가져가서 줄에서 나가 학생들이 [0,1,1], 샌드위치가 [1,0,1]이 됩니다.
•	이 과정이 반복되어 모든 학생들이 샌드위치를 먹을 수 있습니다.

예시 2:

•	입력: students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]
•	출력: 3
•	설명:
•	이 과정이 반복되어 3명의 학생들이 샌드위치를 먹을 수 없습니다.

제약 사항:

•	1 <= students.length, sandwiches.length <= 100
•	students.length == sandwiches.length
•	sandwiches[i]는 0 또는 1입니다.
•	students[i]는 0 또는 1입니다.

문제풀이

class Solution:
   def countStudents(self, students: List[int], sandwiches: List[int]) -> int:
       students = deque(students)
       sandwiches = deque(sandwiches)

       count = 0
       while students and count != len(students):
           if students[0] == sandwiches[0]:
               students.popleft()
               sandwiches.popleft()
               count = 0  
           else:
               students.append(students.popleft())
               count += 1  

       return len(students)

<내 코드의 흐름>

  1. countStudents라는 메서드를 정의합니다.
  • 이 메서드는 students라는 정수 리스트와 sandwiches라는 정수 리스트를 입력으로 받고, 정수를 반환합니다.
  1. students 리스트를 deque로 변환합니다.
  • deque는 양쪽 끝에서 빠르게 삽입 및 삭제가 가능한 자료 구조입니다.
  1. sandwiches 리스트를 deque로 변환합니다.
  2. 연속으로 학생들이 샌드위치를 먹지 못한 횟수를 세는 카운터를 초기화합니다.
  3. students가 비어 있지 않고, count가 students의 길이와 같지 않을 동안 반복합니다.
  • 즉, 모든 학생이 샌드위치를 먹을 수 없게 될 때까지 반복합니다.
  1. 줄의 맨 앞 학생의 선호도가 스택의 맨 위 샌드위치와 같으면, 줄의 맨 앞 학생을 제거합니다.
  2. 스택의 맨 위 샌드위치를 제거합니다.
  3. 그렇지 않으면, 카운터를 0으로 리셋합니다.
  4. 줄의 맨 앞 학생을 줄의 끝으로 보냅니다.
  5. 카운터를 1 증가시킵니다.
  6. 남은 학생의 수를 반환합니다.
profile
개발자계의 제로콜라

0개의 댓글