주간 챌린지 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!