오늘의 공부 키워드

1700. Number of Students Unable to Eat Lunch

 

 

1700. Number of Students Unable to Eat Lunch

문제 설명

학교 급식실에서는 점심시간에 원형과 사각형 샌드위치를 제공합니다. 각각 0과 1로 표현됩니다. 모든 학생들은 줄을 서서 각자 원형 또는 사각형 샌드위치를 선호합니다.

샌드위치의 수는 학생들의 수와 같습니다. 샌드위치는 스택에 쌓여 있습니다. 각 단계에서 다음이 이루어집니다:

  • 줄의 맨 앞 학생이 스택 맨 위의 샌드위치를 선호하면 샌드위치를 가져가고 줄에서 나갑니다.
  • 그렇지 않으면, 샌드위치를 두고 줄의 끝으로 갑니다.

이 과정은 더 이상 줄의 학생들이 스택 맨 위의 샌드위치를 원하지 않아 먹지 못하는 상황이 될 때까지 계속됩니다.

두 개의 정수 배열 students와 sandwiches가 주어집니다. sandwiches[i]는 스택의 i번째 샌드위치의 타입(0이 맨 위)이고, students[j]는 줄의 j번째 학생의 선호도(0이 맨 앞)입니다. 먹지 못하는 학생의 수를 반환하세요.

 

예제

예제 1

  • 입력: students = [1,1,0,0], sandwiches = [0,1,0,1]
  • 출력: 0
  • 설명:
    1. 맨 앞 학생이 맨 위의 샌드위치를 두고 줄 끝으로 가서 students = [1,0,0,1]이 됩니다.
    2. 맨 앞 학생이 맨 위의 샌드위치를 두고 줄 끝으로 가서 students = [0,0,1,1]이 됩니다.
    3. 맨 앞 학생이 맨 위의 샌드위치를 가져가서 students = [0,1,1]이 되고 sandwiches = [1,0,1]이 됩니다.
    4. 맨 앞 학생이 맨 위의 샌드위치를 두고 줄 끝으로 가서 students = [1,1,0]이 됩니다.
    5. 맨 앞 학생이 맨 위의 샌드위치를 가져가서 students = [1,0]이 되고 sandwiches = [0,1]이 됩니다.
    6. 맨 앞 학생이 맨 위의 샌드위치를 두고 줄 끝으로 가서 students = [0,1]이 됩니다.
    7. 맨 앞 학생이 맨 위의 샌드위치를 가져가서 students = [1]이 되고 sandwiches = [1]이 됩니다.
    8. 맨 앞 학생이 맨 위의 샌드위치를 가져가서 students = []이 되고 sandwiches = []이 됩니다.
    9. 따라서 모든 학생들이 샌드위치를 먹을 수 있습니다.

예제 2

  • 입력: students = [1,1,1,0,0,1], sandwiches = [1,0,0,0,1,1]
  • 출력: 3

해결책

이 문제를 해결하기 위해서 다음 단계를 따라갈 수 있습니다:

  1. 각 샌드위치 타입의 수와 학생들의 선호도를 셉니다.
  2. 학생들이 줄을 돌면서 샌드위치를 가져가거나 줄 끝으로 가는 과정을 시뮬레이션합니다.
  3. 만약 더 이상 어떤 학생도 맨 위의 샌드위치를 원하지 않으면, 남은 학생 수를 반환합니다.

코드

def count_students_unable_to_eat(students, sandwiches):
    count0 = students.count(0)
    count1 = students.count(1)
    
    for sandwich in sandwiches:
        if sandwich == 0 and count0 > 0:
            count0 -= 1
        elif sandwich == 1 and count1 > 0:
            count1 -= 1
        else:
            break
            
    return count0 + count1

# 예제 입력
students1 = [1, 1, 0, 0]
sandwiches1 = [0, 1, 0, 1]

students2 = [1, 1, 1, 0, 0, 1]
sandwiches2 = [1, 0, 0, 0, 1, 1]

# 출력
print(count_students_unable_to_eat(students1, sandwiches1))  # 출력: 0
print(count_students_unable_to_eat(students2, sandwiches2))  # 출력: 3

 

 

 

오늘의 공부 키워드

2089 Find Target Indices After Sorting Array

 

2089 Find Target Indices After Sorting Array

 

문제 설명

주어진 문제는 다음과 같습니다:

0부터 시작하는 정수 배열 nums와 목표 요소 target이 주어집니다.

목표 인덱스는 nums[i] == target인 인덱스 i를 의미합니다.

nums를 오름차순으로 정렬한 후의 목표 인덱스 목록을 반환하세요. 만약 목표 인덱스가 없다면 빈 목록을 반환하세요.
반환된 목록은 오름차순으로 정렬되어 있어야 합니다.

 

 

예제

예제 1:

  • 입력: nums = [1, 2, 5, 2, 3], target = 2
  • 출력: [1, 2]
  • 설명: 정렬 후 nums는 [1, 2, 2, 3, 5]가 됩니다. nums[i] == 2인 인덱스는 1과 2입니다.

예제 2:

  • 입력: nums = [1, 2, 5, 2, 3], target = 3
  • 출력: [3]
  • 설명: 정렬 후 nums는 [1, 2, 2, 3, 5]가 됩니다. nums[i] == 3인 인덱스는 3입니다.

예제 3:

  • 입력: nums = [1, 2, 5, 2, 3], target = 5
  • 출력: [4]
  • 설명: 정렬 후 nums는 [1, 2, 2, 3, 5]가 됩니다. nums[i] == 5인 인덱스는 4입니다.

해결 방법

이 문제를 해결하기 위해 다음과 같은 단계를 따를 수 있습니다:

  1. 배열 nums를 오름차순으로 정렬합니다.
  2. 정렬된 배열에서 target 값을 갖는 인덱스를 찾아 저장합니다.
  3. 저장된 인덱스 목록을 반환합니다.

코드 구현

다음은 위 과정을 반영한 파이썬 코드입니다:

def target_indices(nums, target):
    # 1. nums를 정렬합니다.
    nums.sort()
    
    # 2. target 값을 갖는 인덱스를 저장할 리스트를 만듭니다.
    result = []
    
    # 3. 정렬된 nums에서 target 값을 찾고 인덱스를 result에 추가합니다.
    for i in range(len(nums)):
        if nums[i] == target:
            result.append(i)
    
    # 4. 결과 리스트를 반환합니다.
    return result

 

예제 테스트

위의 코드가 주어진 예제들을 제대로 처리하는지 확인해보겠습니다:

print(target_indices([1, 2, 5, 2, 3], 2))  # 예상 출력: [1, 2]
print(target_indices([1, 2, 5, 2, 3], 3))  # 예상 출력: [3]
print(target_indices([1, 2, 5, 2, 3], 5))  # 예상 출력: [4]

 

결론

이 문제는 배열을 정렬하고 목표 값을 찾는 간단한 문제입니다. 중요한 점은 정렬 후 목표 값을 찾아 인덱스를 반환하는 과정입니다. 이 과정을 통해 배열 내 목표 값의 인덱스를 효율적으로 찾을 수 있습니다.

 

 

오늘의 회고

 

  • 아주  재미있던 문제였다.
  • 문제가 점점 난이도가 있는거같다..
  • 실력만이 답이라는 사실을 기억하자

 

오늘의 공부 키워드

2733 Neither Minimum nor Maximum

 

2733 Neither Minimum nor Maximum

문제 해석

주어진 정수 배열 nums에는 서로 다른 양의 정수가 포함되어 있습니다. 이 배열에서 최소값도 최대값도 아닌 수를 찾아 반환하는 문제입니다. 만약 그런 수가 없다면 -1을 반환해야 합니다.

예제 1:

  • 입력: nums = [3,2,1,4]
  • 출력: 2
  • 설명: 이 예제에서 최소값은 1이고 최대값은 4입니다. 따라서 2나 3 중 하나가 유효한 답이 될 수 있습니다.

예제 2:

  • 입력: nums = [1,2]
  • 출력: -1
  • 설명: 이 배열에서는 최소값도 최대값도 아닌 수가 없기 때문에 답이 없습니다.

예제 3:

  • 입력: nums = [2,1,3]
  • 출력: 2
  • 설명: 2는 최소값도 최대값도 아니므로 유효한 답입니다.

코드

def find_number(nums):
    if len(nums) <= 2:
        return -1

    min_value = min(nums)
    max_value = max(nums)

    for num in nums:
        if num != min_value and num != max_value:
            return num
    
    return -1

 

풀이 방법

이 문제를 해결하기 위한 단계는 다음과 같습니다:

  1. nums 배열에서 최소값과 최대값을 찾습니다.
  2. 배열을 순회하면서 최소값도 최대값도 아닌 값을 찾습니다.
  3. 만약 그런 값이 있다면 해당 값을 반환하고, 없다면 -1을 반환합니다.

예제 실행

예제 1:

nums = [3,2,1,4]
print(find_number(nums))  # 출력: 2

 

예제 2

nums = [1,2]
print(find_number(nums))  # 출력: -1

 

예제3

nums = [2,1,3]
print(find_number(nums))  # 출력: 2

 

이 방법은 배열을 순회하면서 최소값과 최대값을 제외한 값을 찾는 간단한 논리로 문제를 해결합니다.

 

오늘의 회고

 

  • 부족함을 느끼지만 실력을 늘리는것이 제일 빠른길임을 명심하자
  • 새로운 개념을 배울수 있어서 좋았다.
  • 생각보다 긴 코드라서 배우고 있는 입장에서 정말 어려웠다

 

오늘의 공부 키워드

  • 2325 Decode the Message

2325 Decode the Message

문제 해석

문자열 key와 message가 주어집니다. 이들은 각각 암호 키와 비밀 메시지를 나타냅니다. 메시지를 해독하기 위한 단계는 다음과 같습니다:

  1. key에서 처음 등장하는 모든 26개의 소문자를 사용하여 치환 테이블의 순서를 만듭니다.
  2. 치환 테이블을 일반 영어 알파벳과 정렬합니다.
  3. 그런 다음 메시지의 각 문자는 테이블을 사용하여 치환됩니다.
  4. 공백(' ')은 그대로 유지됩니다.

예를 들어, key = "the quick brown fox jumps over the lazy dog"와 message = "vkbs bs t suepuv"가 주어졌을 때, 치환 테이블은 다음과 같습니다: ('t' -> 'a', 'h' -> 'b', 'e' -> 'c', ...).

이 문제의 제약 조건은 다음과 같습니다:

  • 26 <= key.length <= 2000
  • key는 소문자 영어 알파벳과 공백(' ')으로 구성됩니다.
  • key는 영어 알파벳의 모든 글자('a'부터 'z'까지)를 적어도 한 번 포함합니다.
  • 1 <= message.length <= 2000
  • message는 소문자 영어 알파벳과 공백(' ')으로 구성됩니다.

풀이 방법

  1. 키 처리:
    • key 문자열에서 처음 등장하는 26개의 소문자를 순서대로 추출합니다.
    • 이 순서대로 치환 테이블을 만듭니다.
    • 예를 들어, key = "the quick brown fox jumps over the lazy dog"일 경우, 처음 등장하는 순서대로 't', 'h', 'e', 'q', 'u', 'i', 'c', 'k', 'b', 'r', 'o', 'w', 'n', 'f', 'x', 'j', 'm', 'p', 's', 'v', 'l', 'a', 'z', 'y', 'd', 'g'가 됩니다.
  2. 치환 테이블 생성:
    • 알파벳 순서와 위에서 추출한 문자를 매핑하여 치환 테이블을 만듭니다.
    • 예를 들어, 't'는 'a', 'h'는 'b', 'e'는 'c'와 같이 매핑됩니다.
  3. 메시지 변환:
    • 주어진 메시지의 각 문자를 치환 테이블을 사용하여 변환합니다.
    • 공백은 그대로 둡니다.
  4. 결과 출력:
    • 변환된 메시지를 출력합니다.

코드

def decode_message(key, message):
    # 1. 키 처리: key에서 처음 등장하는 26개의 소문자 추출
    seen = set()
    substitution_order = []
    for char in key:
        if char.isalpha() and char not in seen:
            seen.add(char)
            substitution_order.append(char)
        if len(substitution_order) == 26:
            break
    
    # 2. 치환 테이블 생성
    substitution_table = {substitution_order[i]: chr(97 + i) for i in range(26)}
    
    # 3. 메시지 변환
    decoded_message = []
    for char in message:
        if char in substitution_table:
            decoded_message.append(substitution_table[char])
        else:
            decoded_message.append(char)
    
    # 4. 결과 출력
    return ''.join(decoded_message)

# 예제 입력
key = "the quick brown fox jumps over the lazy dog"
message = "vkbs bs t suepuv"
print(decode_message(key, message))  # "this is a secret"

 

위 코드는 주어진 key와 message를 사용하여 메시지를 해독하는 방법을 보여줍니다. 첫 번째로 key에서 치환 테이블을 만들고, 이를 사용하여 message를 변환합니다. 이 과정을 통해 중학생도 이해할 수 있도록 쉽게 설명하였습니다.

 

오늘의 회고

 

  • 부족함을 느끼지만 실력을 늘리는것이 제일 빠른길임을 명심하자
  • 새로운 개념을 배울수 있어서 좋았다.
  • 생각보다 긴 코드라서 배우고 있는 입장에서 정말 어려웠다

오늘의 공부 키워드

  • 1528 Suffle String

1528 Shuffle String

주어진 문자열 s와 정수 배열 indices가 있습니다. 문자열 s의 각 문자는 indices 배열의 값에 따라 재배열됩니다.
즉, s의 i번째 위치에 있는 문자는 indices[i] 위치로 이동합니다. 재배열된 문자열을 반환해야한다.

예시

  1. 예시 1:
    • 입력: s = "codeleet", indices = [4,5,6,7,0,2,1,3]
    • 출력: "leetcode"
    • 설명: "codeleet"의 각 문자는 인덱스 배열에 따라 "leetcode"로 재배열됩니다.
  2. 예시 2:
    • 입력: s = "abc", indices = [0,1,2]
    • 출력: "abc"
    • 설명: 각 문자가 제자리에서 움직이지 않으므로 결과는 "abc"입니다.

제약 조건

  • s.length == indices.length == n
  • 1 <= n <= 100
  • s는 소문자 영어 문자로만 구성됩니다.
  • 0 <= indices[i] < n
  • indices의 모든 값은 고유합니다.

해결 방법

이 문제를 해결하기 위해서는 다음 단계를 따릅니다:

  1. indices 배열의 각 위치에 맞게 문자를 재배열할 빈 문자열을 만듭니다.
  2. indices 배열을 순회하며 각 인덱스 위치에 s의 문자를 배치합니다.
  3. 재배열된 문자열을 반환합니다.

구체적인 알고리즘은 다음과 같습니다:

  1. 결과를 저장할 동일한 길이의 빈 리스트 shuffled를 만듭니다.
  2. indices 배열을 순회하면서, 각 indices[i] 위치에 s[i] 문자를 배치합니다.
  3. 리스트를 문자열로 변환하여 반환합니다

코드

from typing import List

class Solution:
    def restoreString(self, s: str, indices: List[int]) -> str:
        shuffled = [''] * len(s)
        for i, index in enumerate(indices):
            shuffled[index] = s[i]
        return ''.join(shuffled)

# 예제 테스트
sol = Solution()
s1 = "codeleet"
indices1 = [4, 5, 6, 7, 0, 2, 1, 3]
print(sol.restoreString(s1, indices1))  # "leetcode"

s2 = "abc"
indices2 = [0, 1, 2]
print(sol.restoreString(s2, indices2))  # "abc"

s3 = "aiohn"
indices3 = [3, 1, 4, 2, 0]
print(sol.restoreString(s3, indices3))  # "nihao"

 

코드 설명

 

  • shuffled 리스트를 s와 동일한 길이로 초기화합니다.
  • indices 배열을 순회하면서 각 인덱스 위치에 s의 문자를 배치합니다.
  • 최종적으로 리스트를 문자열로 변환하여 반환합니다.

오늘의 회고

 

  • 부족함을 느끼지만 실력을 늘리는것이 제일 빠른길임을 명심하자
  • 새로운 개념을 배울수 있어서 좋았다.
 

 

+ Recent posts