TODAY TIL

 오늘은 파이썬에서 자주 사용하는 딕셔너리for문, replace를 쉽게 이해하고 활용하는 방법을 프로그래머스에 관련 문제를 풀어보면서 정리하려고 합니다. 이 글을 통해 딕셔너리의 키와 값, 그리고 이를 활용하는 방법을 알기 쉽게 설명해 보겠습니다.

 

문제 상황: 숫자와 영단어의 변환

코딩을 하다 보면 숫자를 영단어로 바꾸거나, 영단어를 숫자로 바꿔야 하는 상황이 생깁니다. 예를 들어 "one4seveneight" 같은 문자열이 있으면 "1478"로 바꾸고 싶을 때, 파이썬에서 딕셔너리를 활용해 쉽게 해결할 수 있습니다.

 

1. 딕셔너리의 이해: 키와 값

딕셔너리는 두 가지 요소로 이루어져 있습니다:

  • 키 (key): 특정 값을 찾는 데 사용되는 이름입니다.
  • 값 (value): 키에 연결된 실제 데이터입니다.

예를 들어, 숫자와 그에 해당하는 영단어를 딕셔너리로 표현해 보겠습니다.

number_dict = {
    "zero": "0",
    "one": "1",
    "two": "2",
    "three": "3",
    "four": "4",
    "five": "5",
    "six": "6",
    "seven": "7",
    "eight": "8",
    "nine": "9"
}

 

이 딕셔너리에서 는 "zero", "one" 같은 영단어이고, 은 "0", "1" 같은 숫자로 이루어진 문자열입니다.

 

2. 딕셔너리와 for문: 키와 값을 쌍으로 사용하기

 딕셔너리를 반복문 for에서 사용할 때, 키만 가져올 수도 있지만, items() 메서드를 사용하면 키와 값을 쌍으로 가져올 수 있습니다.

예를 들어, for word, digit in number_dict.items():라고 쓰면 word는 키, digit는 값이 됩니다. 따라서, number_dict의 "zero"와 "0"처럼 한 쌍씩 꺼내 올 수 있습니다.

이 구조를 활용해 문자열 속의 영단어를 숫자로 바꿀 수 있습니다.

 

3. replace() 함수로 변환하기

이제 replace() 함수를 활용해 봅시다. replace(찾을 문자열, 바꿀 문자열) 형태로 쓰며, 문자열에서 찾을 부분을 바꿀 부분으로 교체해 줍니다.

예를 들어 s.replace(word, digit)로 for문 안에서 영단어를 숫자로 바꾸는 작업을 할 수 있습니다.

 

 

최종 코드 예시

이제 모든 내용을 종합해서 최종 코드를 작성해 보겠습니다. 예를 들어, "one4seveneight"을 "1478"로 바꾸는 코드입니다:

 

def solution(s):
    # 숫자 영단어 변환표
    number_dict = {
        "zero": "0", "one": "1", "two": "2", "three": "3", "four": "4",
        "five": "5", "six": "6", "seven": "7", "eight": "8", "nine": "9"
    }

    # for문과 replace로 변환하기
    for word, digit in number_dict.items():
        s = s.replace(word, digit)

    return int(s)  # 숫자 형태로 변환 후 반환

 

이 코드는 for문을 통해 딕셔너리의 각 키와 값을 가져와 replace로 문자열에서 단어를 숫자로 교체한 후, 숫자로 반환합니다.

 

정리

  • 딕셔너리는 키-값 쌍으로 구성되어 있습니다.
  • **for word, digit in dict.items()**를 사용하면 키와 값을 한 쌍씩 가져올 수 있습니다.
  • replace() 함수는 찾을 부분과 바꿀 부분을 인자로 받아 문자열을 교체합니다.

이 글을 통해 딕셔너리와 for문, 그리고 replace의 활용법을 잘 이해하셨길 바랍니다! 더 쉬운 설명이나 추가 질문이 있다면 언제든지 댓글로 남겨 주세요. 😊

 

 

TODAY TIL

오늘은 문자열을 특정 규칙에 따라 여러 덩어리로 나누는 문제를 해결해 보았습니다. 이 문제에서는 주어진 문자열을 기준에 따라 잘라내어, 분리된 덩어리 개수를 구해야 했습니다.

 

문제 설명

문자열 s가 주어졌을 때, 다음 규칙을 따라 문자열을 여러 문자열로 분해합니다.

  1. 첫 글자를 읽고, 이 글자를 x로 설정합니다.
  2. 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다.
  3. 두 횟수가 처음으로 같아지는 순간, 지금까지 읽은 문자열을 하나의 덩어리로 분리합니다.
  4. 분리한 문자열을 제외하고 남은 문자열에 대해서 같은 과정을 반복합니다.
  5. 문자열이 모두 처리될 때까지 반복하며, 분리된 문자열의 개수를 반환합니다.

예시:

  • 입력: "banana"
  • 출력: 3 (분리된 문자열: ["ba", "na", "na"])

 

해결 과정

문제를 해결하기 위해 다음 단계로 접근했습니다.

  1. 첫 글자 선택하기: 문자열에서 첫 글자를 x로 설정합니다.
  2. 글자 수 세기: 첫 글자 x의 개수와 x가 아닌 글자의 개수를 세면서 진행합니다.
  3. 덩어리 분리: 두 개의 개수가 같아지는 순간을 기준으로 덩어리를 분리합니다.
  4. 남은 문자열 반복: 문자열의 끝까지 위 과정을 반복하여 남은 모든 문자열을 분리합니다.

 

코드 구현

아래는 이 문제를 해결하는 Python 코드입니다.

def solution(s):
    answer = 0  # 분리된 덩어리 개수
    i = 0  # 현재 위치를 나타내는 인덱스

    while i < len(s):  # 문자열의 끝까지 읽을 때까지 반복
        x = s[i]  # 첫 글자를 x로 설정
        count_x = 0  # x의 개수를 세는 변수
        count_other = 0  # x가 아닌 글자의 개수를 세는 변수

        # x와 다른 글자들을 세어가며 두 개가 같아질 때까지 진행
        while i < len(s):
            if s[i] == x:
                count_x += 1  # x 글자가 나오면 count_x 증가
            else:
                count_other += 1  # 다른 글자가 나오면 count_other 증가

            i += 1  # 다음 글자로 이동

            # x와 다른 글자의 개수가 같아지면 덩어리 분리
            if count_x == count_other:
                answer += 1  # 덩어리 하나 추가
                break  # 분리 후 다시 반복
    
        # 남은 문자열이 있으면 마지막 덩어리로 추가
        if i == len(s) and count_x != count_other:
            answer += 1
    
    return answer

 

코드 설명

  • 첫 글자 설정: 처음 x를 설정해주고, count_x와 count_other를 초기화합니다.
  • 문자 개수 세기: count_x는 x 글자, count_other는 x가 아닌 글자의 개수를 나타내며, 둘이 같아질 때마다 덩어리를 하나 추가합니다.
  • 남은 문자열 처리: 문자열 끝까지 다 읽었는데도 두 개수가 다르다면 남은 문자열을 마지막 덩어리로 간주합니다.

예제 테스트

# 예제 입력
print(solution("banana"))  # 출력: 3
print(solution("abracadabra"))  # 출력: 6
print(solution("aaabbaccccabba"))  # 출력: 3

 

배운 점

  • 문자열의 특정 규칙을 기준으로 구분해야 할 때, 문자를 카운팅하는 방법이 유용하다는 것을 알게 되었습니다.
  • 분리 조건에 따라 반복문을 중간에 빠져나오거나 특정 조건을 설정하는 것이 중요함을 깨달았습니다.
  • 알고리즘의 기초를 배우는게 중요하다는걸 느꼈습니다.

이 포스팅을 통해 문자열 분리 문제를 규칙적으로 해결하는 방법을 익힐 걸 공유할수 있어서 좋았습니다.

 

TODAY TIL

오늘의 문제는  프로그래머스에 있는 크기가 작은 부분 문자열 였는데요.

아직 알고리즘이 익숙하지 않은 초보지만 푼 내용을 정리하기 위해서 작성해 봅니다.

 

문제 설명
주어진 숫자 문자열 t와 p가 있을 때, t에서 p와 길이가 같은 부분 문자열을 잘라내어 숫자로 변환한 뒤, 이 숫자가 p보다 작거나 같은 경우를 찾는 문제입니다.

  • 예를 들어, t = "3141592"이고 p = "271"이라면, t에서 길이가 3인 부분 문자열을 추출하여 숫자로 변환하고 271보다 작거나 같은 경우를 세어야 합니다.

입력 예시

  • t = "3141592"
  • p = "271"

출력 예시

  • 결과: 2 (141, 159 두 개의 숫자가 271보다 작음)

문제 해결 방법

이 문제를 단계별로 쉽게 풀이해보겠습니다.

  1. 부분 문자열 길이 구하기
    p의 길이와 같은 길이의 부분 문자열을 t에서 잘라낼 것입니다. 따라서, p의 길이를 미리 구해 놓습니다.
  2. 반복문으로 부분 문자열 만들기
    t에서 p의 길이만큼 부분 문자열을 하나씩 잘라내야 하므로, t를 처음부터 끝까지 순회하면서 p와 같은 길이의 부분 문자열을 만듭니다.
  3. 숫자 변환 후 비교하기
    잘라낸 부분 문자열을 숫자로 변환한 뒤, p와 비교합니다. 만약 p보다 작거나 같은 숫자라면, 이 부분 문자열은 조건에 맞는 것이 됩니다.
  4. 개수 세기
    조건에 맞는 부분 문자열이 나올 때마다 개수를 하나씩 더합니다.
  5. 최종 결과 반환하기
    반복이 끝나면 조건에 맞는 부분 문자열의 개수를 반환합니다.

코드 구현

def solution(t, p):
    length_p = len(p)  # p의 길이를 구해서 저장
    count = 0  # 조건에 맞는 부분 문자열 개수를 세기 위한 변수
    
    for i in range(len(t) - length_p + 1):  # t에서 부분 문자열을 잘라내기 위한 반복문
        substring = t[i:i + length_p]  # 부분 문자열 생성
        if int(substring) <= int(p):  # 숫자로 변환해 p와 비교
            count += 1  # 조건을 만족하면 count를 1 증가
    
    return count  # 최종 개수 반환

 

 

한 줄씩 아주 쉽게 설명하기

  1. length_p = len(p)
    • p의 길이를 구해서 length_p에 저장. 이 길이만큼 t에서 잘라냄
  2. count = 0
    • 조건에 맞는 숫자가 몇 개인지 세기 위해 처음에 count를 0으로 설정.
  3. for i in range(len(t) - length_p + 1)
    • t에서 p와 같은 길이만큼 잘라낼 건데, 한 글자씩 오른쪽으로 이동하면서 잘라냄.
    • 예를 들어, p의 길이가 3이면 t에서 첫 글자부터 3글자씩 이동하면서 반복.
  4. substring = t[i:i + length_p]
    • t의 i 위치부터 p와 같은 길이만큼 잘라내서 substring이라는 부분 문자열을 만듬.
    • 예를 들어, t = "3141592"이고 p = "271"이라면, substring이 314, 141, 415... 이렇게 돼요.
  5. if int(substring) <= int(p)
    • substring과 p를 숫자로 바꿔서 비교
    • 만약 substring이 p보다 작거나 같으면 조건을 만족
  6. count += 1
    • 조건을 만족하면 count를 1씩 더해요.
  7. return count
    • 마지막으로 조건에 맞는 개수(count)를 결과로 내보내요.

코드 예시

출력 결과

  • 예를 들어, t = "3141592"이고 p = "271"이면:
    • 314, 141, 415, 159, 592 중에서 271보다 작거나 같은 숫자는 141과 159 두 개니까, 답은 2가 됩니다.

✍️ 풀이 요약

이 문제는 주어진 문자열에서 특정 조건을 만족하는 부분 문자열을 찾아서 개수를 세는 문제입니다. p의 길이만큼 부분 문자열을 t에서 하나씩 잘라내면서, p보다 작거나 같은지를 비교하는 방식으로 간단하게 풀이할 수 있습니다.

 

문제 풀고 느낀점

  • 어떻게 풀어야 할지 생각을 많이 해서 풀게되었다.
  • 문제를 해석하고 하나하나씩 풀어나가는게 중요하다는걸 느꼈다.
  • CHAT GPT를 사용한다면 바로 답을 알려달라고 하지말고 문제 푸는 방법에 대해서 물어보자 그럼 해결방법의 힌트를 제공해준다.
  • 코드를 모르면 하나씩 설명해 달라고 하자 이해하기가 쉽다.
 

 

TODAY TIL

99 클럽에서 진행하는 코딩 테스트 스터디 4기를 오늘부터 시작하게 되었습니다.

그리하여서 매일 99 클럽에서 제시해준 문제를 풀고 공부 내용이나 문제 풀이를 정리 하려고 합니다.

오늘의 문제는  프로그래머스에 있는 문자열 내 p와 y의 개수 였는데요.

아직 알고리즘이 익숙하지 않은 초보지만 열심히 공부해보겠습니다.

 

문자열에서 'p'와 'y'의 개수 비교하기

문제 설명

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. 이 문자열에서 'p'의 개수와 'y'의 개수를 비교해 두 개수가 같으면 True, 다르면 False를 반환하는 함수를 작성해야 합니다. 만약 'p'와 'y' 모두 문자열에 없을 경우, 결과는 항상 True를 반환해야 합니다. 이때, 대소문자를 구별하지 않고 비교하는 것이 포인트입니다.

예시

  • 입력 "pPoooyY" ➔ 출력 True
  • 입력 "Pyy" ➔ 출력 False

제한사항

  • 문자열 s의 길이는 50 이하의 자연수입니다.
  • 문자열 s는 오직 알파벳으로만 구성됩니다.

문제 해결 단계

이 문제는 문자열에서 특정 문자의 개수를 세고 두 개수를 비교하는 문제입니다. 이를 중학생도 이해하기 쉽게 세 단계로 나누어 설명해 보겠습니다.

1단계: 모든 문자를 소문자로 변환하기

문제에서 대문자와 소문자를 구별하지 않으므로, 먼저 문자열의 모든 문자를 소문자로 바꿔서 비교를 쉽게 만듭니다.
예를 들어, "pPoooyY"를 모두 소문자로 변환하면 "ppoooyy"가 됩니다.

2단계: 'p'와 'y'의 개수 세기

소문자로 변환된 문자열에서 'p'와 'y'가 몇 번씩 나오는지 셉니다.
Python에서는 .count()라는 함수를 사용해 특정 문자의 개수를 쉽게 셀 수 있습니다.

 

s.count('p')  # 문자열에서 'p'의 개수
s.count('y')  # 문자열에서 'y'의 개수

 

3단계: 'p'와 'y'의 개수 비교하기

마지막으로 'p'의 개수와 'y'의 개수를 비교해, 두 개수가 같으면 True, 다르면 False를 반환합니다. 만약 두 문자 모두 없다면 개수가 0으로 같기 때문에 자동으로 True가 반환됩니다.

 

파이썬 코드

def solution(s):
    # 1단계: 모든 문자를 소문자로 변환
    s = s.lower()
    
    # 2단계: 'p'와 'y'의 개수 세기
    p_count = s.count('p')
    y_count = s.count('y')
    
    # 3단계: 'p'와 'y'의 개수 비교하여 결과 반환
    return p_count == y_count

 

결과

  • 입력: "pPoooyY"
    • 소문자로 변환: "ppoooyy"
    • 'p'의 개수 = 2, 'y'의 개수 = 2
    • 출력: True
  • 입력: "Pyy"
    • 소문자로 변환: "pyy"
    • 'p'의 개수 = 1, 'y'의 개수 = 2
    • 출력: False

문제 풀고 느낀점

  • 어떻게 풀어야 할지 생각을 많이 해서 풀게되었다.
  • 문제를 해석하고 하나하나씩 풀어나가는게 중요하다는걸 느꼈다.
  • 결과를 보고 나면 쉽지만 좀더 알고리즘의 공부를 많이 해야겠다는 생각 많이 했다.
  • 문제를 더 많이 풀어봐야겠다고 생각했다.

 

오늘의 공부 키워드

2864  Maximim odd Binary Number

 

2864  Maximim odd Binary Number

문제 설명

이진 문자열 s가 주어졌을 때, 이 문자열을 재배열하여 만들 수 있는 가장 큰 홀수 이진 숫자를 구하는 것입니다. 홀수 이진 숫자는 마지막 자리가 '1'이어야 합니다. 주어진 문자열에는 최소한 하나의 '1'이 포함되어 있습니다.

 

예제

  1. 입력: s = "010"
    • 출력: "001"
    • 설명: '1'이 하나밖에 없으므로 마지막 자리에 위치시킵니다. 따라서 답은 "001"입니다.
  2. 입력: s = "0101"
    • 출력: "1001"
    • 설명: '1' 중 하나는 마지막에 배치하고, 나머지 숫자들을 앞에 배치하여 가장 큰 숫자를 만듭니다. 따라서 답은 "1001"입니다.

문제 해결 방법

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

  1. 주어진 문자열 s에서 '1'의 개수를 셉니다.
  2. 마지막 자리에 '1'을 하나 배치합니다.
  3. 나머지 '1'과 '0'을 모두 앞에 배치하여 가장 큰 숫자를 만듭니다

 

파이썬 코드 구현

def maximumOddBinaryNumber(s: str) -> str:
    count_1 = s.count('1')
    count_0 = len(s) - count_1
    
    # '1' 하나는 마지막에 배치
    result = '1' * (count_1 - 1) + '0' * count_0 + '1'
    return result

# 예제 입력을 테스트해보세요.
print(maximumOddBinaryNumber("010"))  # 출력: "001"
print(maximumOddBinaryNumber("0101")) # 출력: "1001"

 

코드 설명

  1. count_1 = s.count('1')는 문자열 s에서 '1'의 개수를 셉니다.
  2. count_0 = len(s) - count_1는 문자열 s에서 '0'의 개수를 셉니다.
  3. '1' * (count_1 - 1) + '0' * count_0 + '1'는 마지막 자리에 '1'을 배치하고, 나머지 '1'과 '0'을 앞에 배치하여 가장 큰 숫자를 만듭니다.

이와 같은 방법으로 주어진 이진 문자열을 재배열하여 가장 큰 홀수 이진 숫자를 만들 수 있습니다. 이 문제는 간단하지만, 기본적인 이진수의 특성과 문자열 처리 방법을 이해하는 데 도움이 됩니다.

 

마무리

이 글에서는 이진 문자열을 재배열하여 최대 홀수 이진 숫자를 만드는 문제를 해결하는 방법을 설명했습니다. 파이썬 코드를 통해 문제 해결 과정을 자세히 설명하였으니, 비슷한 문제를 해결할 때 도움이 되길 바랍니다.

여러분도 직접 코드를 작성해 보고, 다양한 입력값으로 테스트해 보세요. 이를 통해 문제 해결 능력을 키울 수 있을 것입니다. 감사합니다!

 

오늘의 공부 키워드

1337 The K Weakest Rows in a Matrix

 

1337 The K Weakest Rows in a Matrix

이 문제는 이진 행렬에서 각 행의 군인 수를 계산하고, 주어진 k 값에 따라 가장 약한 행의 인덱스를 반환하는 문제입니다. 주어진 조건에 따라 각 행의 군인 수를 계산하고, 같은 수의 군인을 가진 행은 인덱스 순서대로 정렬합니다. 이를 통해 가장 약한 k개의 행을 구할 수 있습니다.

 

문제를 해결하는 방법은 다음과 같습니다:

  1. 각 행의 군인 수를 계산합니다.
  2. 행의 인덱스와 군인 수를 튜플로 묶어 리스트를 만듭니다.
  3. 이 리스트를 군인 수와 인덱스를 기준으로 정렬합니다.
  4. 정렬된 리스트에서 가장 약한 k개의 행의 인덱스를 추출합니다.

파이썬코드

def kWeakestRows(mat, k):
    # 각 행의 군인 수를 계산하여 리스트 생성
    soldiers_count = [(sum(row), index) for index, row in enumerate(mat)]
    
    # 군인 수와 인덱스를 기준으로 정렬
    soldiers_count.sort()
    
    # 가장 약한 k개의 행의 인덱스를 추출하여 반환
    return [index for _, index in soldiers_count[:k]]

# 예시 입력
mat1 = [
    [1, 1, 0, 0, 0],
    [1, 1, 1, 1, 0],
    [1, 0, 0, 0, 0],
    [1, 1, 0, 0, 0],
    [1, 1, 1, 1, 1]
]
k1 = 3

mat2 = [
    [1, 0, 0, 0],
    [1, 1, 1, 1],
    [1, 0, 0, 0],
    [1, 0, 0, 0]
]
k2 = 2

# 결과 출력
print(kWeakestRows(mat1, k1))  # Output: [2, 0, 3]
print(kWeakestRows(mat2, k2))  # Output: [0, 2]

 

이 코드는 각 행의 군인 수를 계산하고, 이를 이용해 행을 정렬한 후 가장 약한 k개의 행의 인덱스를 반환합니다. 행렬의 각 행은 튜플 형태로 군인 수와 인덱스를 가지고 정렬되며, 이를 통해 약한 행을 쉽게 찾을 수 있습니다.

 

 

오늘의 공부 키워드

2500 Delete Greatest Value in Each Row

 

2500 Delete Greatest Value in Each Row

 

 

이 문제에서 주어진 m x n 행렬 grid는 양의 정수로 이루어져 있습니다. 문제에서 요구하는 연산을 수행하여 grid가 빌 때까지 계속 진행해야 합니다.

주어진 연산은 다음과 같습니다:

  1. 각 행에서 가장 큰 값을 삭제합니다. 만약 가장 큰 값이 여러 개 있다면 그 중 하나를 임의로 삭제합니다.
  2. 삭제된 원소들 중 최대값을 결과값(answer)에 더합니다.

이 연산을 모든 열이 삭제될 때까지 반복하고, 최종적으로 answer 값을 반환합니다.

해석 예제 1:

입력: grid = [[1,2,4],[3,3,1]] 출력: 8 설명: 각 단계에서 삭제된 값을 보여줍니다.

  • 첫 번째 연산에서, 첫 번째 행에서 4를 삭제하고 두 번째 행에서 3을 삭제합니다(3이 두 개 있으며 하나를 임의로 삭제할 수 있습니다). 4를 결과에 추가합니다.
  • 두 번째 연산에서, 첫 번째 행에서 2를 삭제하고 두 번째 행에서 3을 삭제합니다. 3을 결과에 추가합니다.
  • 세 번째 연산에서, 첫 번째 행에서 1을 삭제하고 두 번째 행에서 1을 삭제합니다. 1을 결과에 추가합니다. 최종 결과 = 4 + 3 + 1 = 8.

해석 예제 2:

입력: grid = [[10]] 출력: 10 설명: 각 단계에서 삭제된 값을 보여줍니다.

  • 첫 번째 연산에서, 행에서 10을 삭제합니다. 10을 결과에 추가합니다. 최종 결과 = 10.

풀이 방법:

문제의 요구사항을 따르면 각 행에서 최대값을 찾고, 이 중에서 전체의 최대값을 뽑아 더하는 과정을 반복합니다. m이 행의 수, n이 열의 수이므로, 각 단계마다 O(m) 시간이 걸리며, 최대값을 찾는 것은 O(n)이므로 전체 연산은 O(m * n)의 시간 복잡도를 갖습니다. 각 열을 한 번씩 삭제하므로 총 O(n * m * n)의 연산이 필요합니다. 그러나 이는 최악의 경우이며, 일반적인 파이썬의 내장 함수를 사용하여 최적화할 수 있습니다.

 

파이썬 코드

def max_value_removals(grid):
    answer = 0
    while grid[0]:  # 이 반복은 최대 n번 (열의 수 만큼)
        max_vals = []
        for row in grid:
            max_val = max(row)
            max_vals.append(max_val)
            row.remove(max_val)  # 가장 큰 값 하나를 삭제
        answer += max(max_vals)  # 각 행에서 삭제된 값 중 최대값을 더함
    return answer

# 예제 실행
print(max_value_removals([[1,2,4],[3,3,1]]))  # 출력: 8
print(max_value_removals([[10]]))  # 출력: 10

 

오늘의 공부 키워드

682 Baseball Game

 

682 Baseball Game

문제 설명

야구 게임이 시작될 때 기록은 비어 있습니다. 주어진 명령어 리스트를 순서대로 처리하며 점수를 기록합니다. 명령어는 다음과 같습니다:

  • 정수 x: 새로운 점수 x를 기록합니다.
  • '+': 이전 두 점수의 합을 새로운 점수로 기록합니다.
  • 'D': 이전 점수의 두 배를 새로운 점수로 기록합니다.
  • 'C': 이전 점수를 무효화하고 기록에서 제거합니다.

모든 명령어를 처리한 후 기록된 모든 점수의 합을 반환합니다.

예시

예시 1

입력: ops = ["5", "2", "C", "D", "+"] 출력: 30

설명:

  • "5" -> 기록에 5를 추가, 기록: [5]
  • "2" -> 기록에 2를 추가, 기록: [5, 2]
  • "C" -> 마지막 점수 2를 제거, 기록: [5]
  • "D" -> 마지막 점수 5의 두 배인 10을 추가, 기록: [5, 10]
  • "+" -> 마지막 두 점수 5와 10의 합인 15를 추가, 기록: [5, 10, 15]

기록된 점수의 합: 5 + 10 + 15 = 30

예시 2

입력: ops = ["5", "-2", "4", "C", "D", "9", "+", "+"] 출력: 27

설명:

  • "5" -> 기록에 5를 추가, 기록: [5]
  • "-2" -> 기록에 -2를 추가, 기록: [5, -2]
  • "4" -> 기록에 4를 추가, 기록: [5, -2, 4]
  • "C" -> 마지막 점수 4를 제거, 기록: [5, -2]
  • "D" -> 마지막 점수 -2의 두 배인 -4를 추가, 기록: [5, -2, -4]
  • "9" -> 기록에 9를 추가, 기록: [5, -2, -4, 9]
  • "+" -> 마지막 두 점수 -4와 9의 합인 5를 추가, 기록: [5, -2, -4, 9, 5]
  • "+" -> 마지막 두 점수 9와 5의 합인 14를 추가, 기록: [5, -2, -4, 9, 5, 14]

기록된 점수의 합: 5 + (-2) + (-4) + 9 + 5 + 14 = 27

예시 3

입력: ops = ["1", "C"] 출력: 0

설명:

  • "1" -> 기록에 1을 추가, 기록: [1]
  • "C" -> 마지막 점수 1을 제거, 기록: []

기록된 점수의 합: 0

 

해결 방법

  1. 기록을 저장할 빈 리스트를 생성합니다.
  2. 주어진 명령어 리스트를 순차적으로 처리합니다.
  3. 각 명령어에 따라 기록을 업데이트합니다.
  4. 모든 명령어를 처리한 후 기록된 점수의 합을 반환합니다.

 

파이썬 코드

from typing import List

class Solution:
    def calPoints(self, operations: List[str]) -> int:
        record = []
        
        for op in operations:
            if op == "C":
                record.pop()
            elif op == "D":
                record.append(2 * record[-1])
            elif op == "+":
                record.append(record[-1] + record[-2])
            else:
                record.append(int(op))
        
        return sum(record)

# 예시 실행
solution = Solution()

ops1 = ["5", "2", "C", "D", "+"]
print(solution.calPoints(ops1))  # 출력: 30

ops2 = ["5", "-2", "4", "C", "D", "9", "+", "+"]
print(solution.calPoints(ops2))  # 출력: 27

ops3 = ["1", "C"]
print(solution.calPoints(ops3))  # 출력: 0

 

이 코드는 주어진 명령어 리스트를 순차적으로 처리하며 기록을 관리하고, 최종적으로 기록된 점수의 합을 계산하여 반환합니다. 예시 입력값에 대해 메서드를 호출하여 올바른 출력이 나오는지 확인할 수 있습니다.

 

오늘의 공부 키워드

1475 Final Prices With a Special Discount in a Shop

 

1475 Final Prices With a Special Discount in a Shop

문제 설명

주어진 정수 배열 prices에서 각 아이템의 가격이 주어집니다. 특별 할인을 받을 수 있는 조건은 다음과 같습니다:

  • i번째 아이템을 살 때, j가 i보다 크고 prices[j]가 prices[i]보다 작거나 같은 최소의 인덱스를 찾아서 prices[j] 만큼의 할인을 받습니다.
  • 만약 그런 인덱스가 없다면 할인을 받지 못합니다.

주어진 배열 prices에서 각 아이템의 최종 지불 가격을 계산하여 반환하는 정수 배열 answer를 반환하는 문제입니다.

예제

  1. 예제 1:
    • 입력: prices = [8, 4, 6, 2, 3]
    • 출력: [4, 2, 4, 2, 3]
    • 설명:
      • 아이템 0: 가격은 8이고, 최소 인덱스 1에서 4만큼 할인받아 최종 가격은 4입니다.
      • 아이템 1: 가격은 4이고, 최소 인덱스 3에서 2만큼 할인받아 최종 가격은 2입니다.
      • 아이템 2: 가격은 6이고, 최소 인덱스 3에서 2만큼 할인받아 최종 가격은 4입니다.
      • 아이템 3: 할인을 받지 못하여 최종 가격은 2입니다.
      • 아이템 4: 할인을 받지 못하여 최종 가격은 3입니다.
  2. 예제 2:
    • 입력: prices = [1, 2, 3, 4, 5]
    • 출력: [1, 2, 3, 4, 5]
    • 설명: 모든 아이템이 할인을 받지 못합니다.
  3. 예제 3:
    • 입력: prices = [10, 1, 1, 6]
    • 출력: [9, 0, 1, 6]
    • 설명:
      • 아이템 0: 가격은 10이고, 최소 인덱스 1에서 1만큼 할인받아 최종 가격은 9입니다.
      • 아이템 1: 가격은 1이고, 최소 인덱스 2에서 1만큼 할인받아 최종 가격은 0입니다.
      • 아이템 2: 할인을 받지 못하여 최종 가격은 1입니다.
      • 아이템 3: 할인을 받지 못하여 최종 가격은 6입니다.

파이썬코드

def finalPrices(prices):
    n = len(prices)
    answer = [0] * n

    for i in range(n):
        discount = 0
        for j in range(i + 1, n):
            if prices[j] <= prices[i]:
                discount = prices[j]
                break
        answer[i] = prices[i] - discount

    return answer

# 예제 테스트
print(finalPrices([8, 4, 6, 2, 3]))  # 출력: [4, 2, 4, 2, 3]
print(finalPrices([1, 2, 3, 4, 5]))  # 출력: [1, 2, 3, 4, 5]
print(finalPrices([10, 1, 1, 6]))    # 출력: [9, 0, 1, 6]

 

풀이 방법

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

  1. prices 배열을 순회하면서 각 아이템의 가격을 확인합니다.
  2. 각 아이템의 가격에 대해 뒤에 나오는 가격 중에서 최소 가격을 찾습니다.
  3. 최소 가격을 찾아서 할인을 적용하고 최종 가격을 계산합니다.
  4. 최종 가격을 answer 배열에 저장합니다.

결론

이 글에서는 파이썬을 사용하여 'Final Prices With a Special Discount in a Shop' 문제를 해결하는 방법에 대해 살펴보았습니다. 각 아이템에 대해 뒤에 나오는 최소 가격을 찾아 할인을 적용하는 방법을 사용하여 문제를 해결할 수 있었습니다. 이 문제를 통해 조건문과 반복문을 활용한 배열 탐색 방법을 익힐 수 있습니다.

 

오늘의 공부 키워드

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

 

 

+ Recent posts