티스토리 뷰
[Python]25501번, 파이썬에서 전역변수 사용하기
Vagabund.Gni 2023. 4. 20. 15:07문제
정휘는 후배들이 재귀 함수를 잘 다루는 재귀의 귀재인지 알아보기 위해 재귀 함수와 관련된 문제를 출제하기로 했다.
팰린드롬이란, 앞에서부터 읽었을 때와 뒤에서부터 읽었을 때가 같은 문자열을 말한다.
팰린드롬의 예시로 AAA, ABBA, ABABA 등이 있고, 팰린드롬이 아닌 문자열의 예시로 ABCA, PALINDROME 등이 있다.
어떤 문자열이 팰린드롬인지 판별하는 문제는 재귀 함수를 이용해 쉽게 해결할 수 있다.
아래 코드의 isPalindrome 함수는 주어진 문자열이 팰린드롬이면 1, 팰린드롬이 아니면 0을 반환하는 함수다.
#include <stdio.h>
#include <string.h>
int recursion(const char *s, int l, int r){
if(l >= r) return 1;
else if(s[l] != s[r]) return 0;
else return recursion(s, l+1, r-1);
}
int isPalindrome(const char *s){
return recursion(s, 0, strlen(s)-1);
}
int main(){
printf("ABBA: %d\n", isPalindrome("ABBA")); // 1
printf("ABC: %d\n", isPalindrome("ABC")); // 0
}
정휘는 위에 작성된 isPalindrome 함수를 이용하여 어떤 문자열이 팰린드롬인지 여부를 판단하려고 한다.
구체적으로는, 문자열 S를 isPalindrome 함수의 인자로 전달하여 팰린드롬 여부를 반환값으로 알아낼 것이다.
더불어 판별하는 과정에서 recursion 함수를 몇 번 호출하는지 셀 것이다.
정휘를 따라 여러분도 함수의 반환값과 recursion 함수의 호출 횟수를 구해보자.
입력
첫째 줄에 테스트케이스의 개수 T가 주어진다. (1 ≤ T ≤ 1,000)
둘째 줄부터 T개의 줄에 알파벳 대문자로 구성된 문자열 S가 주어진다. (1 ≤ |S| ≤ 1,000)
출력
각 테스트케이스마다, isPalindrome 함수의 반환값과 recursion 함수의 호출 횟수를 한 줄에 공백으로 구분하여 출력한다.
풀이
그냥 재귀함수를 연습하는 별 거 없는 문제다.
진짜 문제는 내가 여태 파이썬에서 전역변수를 선언해 본 적이 없다는 것..
그냥 메서드 위에 독립적으로 적어주면 되는 줄 알고 몇 번을 시도했다가 실패만 했다.
알고 보니 선언뿐 아니라 메서드 내부에서도 전역변수라는 의미로 global을 써주어야 했다.
해서 전역변수를 적용한 정답 코드는 아래와 같다.
반복문을 새로 시작할 때마다 cnt를 0으로 초기화해 주는 것도 잊으면 안 된다.
import sys
cnt = 0
def recursion(s, l, r):
global cnt
cnt += 1
if l >= r:
return 1
elif s[l] != s[r]:
return 0
else:
return recursion(s, l + 1, r - 1)
def isPalindrome(s):
return recursion(s, 0, len(s) - 1)
t = int(sys.stdin.readline().rstrip())
for _ in range(t):
cnt = 0
s = sys.stdin.readline().rstrip()
print(isPalindrome(s), cnt)
'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글
[Java+Python]2559번, 수열 (0) | 2023.05.21 |
---|---|
[Java+Python]11659번, 구간 합 구하기 4 (2) | 2023.05.20 |
[Python]2447번, 별 찍기-10, 재귀함수 (2) | 2023.04.22 |
[Python]5430번, AC함수, 덱 마지막 문제 (0) | 2023.04.19 |
[Python]1021번, 원형 큐 (0) | 2023.04.18 |
[Python]1874번, 스택 수열 (0) | 2023.04.16 |
- Total
- Today
- Yesterday
- a6000
- BOJ
- 자바
- 스프링
- 세모
- 동적계획법
- java
- 면접 준비
- 유럽
- 세계여행
- 칼이사
- 알고리즘
- 리스트
- spring
- Backjoon
- 기술면접
- 중남미
- 여행
- 스트림
- 지지
- RX100M5
- 세계일주
- Python
- 야경
- 남미
- Algorithm
- 백준
- 파이썬
- 맛집
- 유럽여행
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |