>백엔드 개발 >파이썬 튜토리얼 >igits로 수익을 창출하세요

igits로 수익을 창출하세요

Patricia Arquette
Patricia Arquette원래의
2025-01-12 18:12:43848검색

Earn with igits

주간 챌린지 303: Python 및 Perl 솔루션

Mohammad S. Anwar의 주간 챌린지는 정기적인 코딩 연습을 제공합니다. 아래에 제시된 내 솔루션은 처음에는 Python으로 제작된 다음 Perl에 적용되었습니다. 이러한 이중 접근 방식은 코딩 숙련도를 향상시킵니다.

도전 303: 솔루션

과제 1: 짝수 3자리 정수 생성

작업 설명:

양의 정수 목록이 주어지면 목록의 숫자를 사용하여 구성할 수 있는 고유한 3자리 정수를 모두 생성하세요.

Python 솔루션:

이 Python 솔루션은 itertools.permutations 함수를 활용하여 가능한 모든 3자리 조합을 효율적으로 생성합니다. 고유성을 유지하기 위해 세트를 사용합니다.

<code class="language-python">from itertools import permutations

def three_digits_even(ints: list) -> list:
    solution = set()
    for p in permutations(ints, 3):
        num_str = "".join(map(str, p))
        num = int(num_str)
        if num >= 100 and num % 2 == 0 and num_str[0] != '0':
            solution.add(num)
    return sorted(list(solution))</code>

Perl 솔루션:

Perl에서는 고유성을 보장하기 위해 순열과 해시에 Algorithm::Permute 모듈을 사용합니다.

<code class="language-perl">use Algorithm::Permute;
sub three_digits_even {
    my @ints = @_;
    my %seen;
    my @result;
    my $p = Algorithm::Permute->new(\@ints, 3);
    while (my @perm = $p->next) {
        my $num_str = join('', @perm);
        my $num = $num_str;
        if ($num >= 100 and $num % 2 == 0 and $num_str !~ /^0/) {
            push @result, $num unless $seen{$num}++;
        }
    }
    return sort {$a <=> $b} @result;
}</code>

예:

<code># Python
print(three_digits_even([2, 1, 3, 0]))  # Output: [102, 120, 130, 132, 210, 230, 302, 310, 312, 320]
print(three_digits_even([2, 2, 8, 8, 2])) # Output: [222, 228, 282, 288, 822, 828, 882]

# Perl
print "@{[three_digits_even(2, 1, 3, 0)]}\n"; # Output: 102 120 130 132 210 230 302 310 312 320
print "@{[three_digits_even(2, 2, 8, 8, 2)]}\n"; # Output: 222 228 282 288 822 828 882</code>

작업 2: 삭제 및 적립

작업 설명:

정수 배열이 주어지면 요소를 반복적으로 삭제하고 해당 값을 획득한 다음 삭제된 요소보다 값이 1 적고 1 큰 요소를 모두 삭제하여 획득할 수 있는 최대 포인트 수를 구하세요.

Python 솔루션:

이 Python 솔루션은 Counter을 사용하여 요소 빈도를 추적하고 재귀 함수를 사용하여 다양한 삭제 전략을 탐색합니다.

<code class="language-python">from collections import Counter

def delete_and_earn(ints: list) -> int:
    freq = Counter(ints)
    return max_score(freq)

def max_score(freq: Counter) -> int:
    max_points = 0
    for num in list(freq): # Iterate through a copy to safely delete
        points = num * freq[num]
        new_freq = freq.copy()
        del new_freq[num]
        if num - 1 in new_freq:
            del new_freq[num - 1]
        if num + 1 in new_freq:
            del new_freq[num + 1]
        max_points = max(max_points, points + (0 if not new_freq else max_score(new_freq)))
    return max_points</code>

Perl 솔루션:

Perl 솔루션은 빈도 계산을 위한 해시와 재귀 함수를 사용하는 Python 접근 방식을 반영합니다.

<code class="language-perl">sub delete_and_earn {
    my %freq = map { $_ => 1 + $freq{$_} // 0 } @_;
    return max_score(\%freq);
}

sub max_score {
    my $freq = shift;
    my $max_points = 0;
    foreach my $num (keys %$freq) {
        my $points = $num * $freq->{$num};
        my %new_freq = %$freq;
        delete $new_freq{$num};
        delete $new_freq{$num - 1};
        delete $new_freq{$num + 1};
        $max_points = max($max_points, $points + (0 || max_score(\%new_freq)));
    }
    return $max_points;
}

sub max {
    return shift if @_ == 1;
    return $_[0] > $_[1] ? $_[0] : $_[1];
}</code>

예:

<code># Python
print(delete_and_earn([3, 4, 2]))  # Output: 6
print(delete_and_earn([2, 2, 3, 3, 3, 4])) # Output: 9

# Perl
print delete_and_earn(3, 4, 2), "\n";  # Output: 6
print delete_and_earn(2, 2, 3, 3, 3, 4), "\n"; # Output: 9</code>

이러한 솔루션은 주간 챌린지 303에서 두 작업을 해결하기 위한 효율적이고 명확한 접근 방식을 보여줍니다. Python과 Perl을 모두 사용하면 다양한 프로그래밍 언어에 걸쳐 알고리즘 문제 해결의 전송 가능한 특성이 강조됩니다.

위 내용은 igits로 수익을 창출하세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.