728x90
def stringReverse(myString) :
    '''
    문자열 myString을 뒤집어서 반환하는 함수를 작성하세요.
    '''
    if(len(myString) == 1):
        return myString[0]    
    result = myString[len(myString)-1 : len(myString)] + stringReverse(myString[:len(myString)-1])
    
    return result

def main():
    '''
    테스트를 하고싶으면, 아래 부분을 수정합니다.
    '''

    myString = input()
    print(stringReverse(myString))
if __name__ == "__main__":
    main()

처음 문제를 풀었을 때는 매개변수에 count라는 변수를 추가했었다.

재귀가 깊어지는 것을 감지하기 위해서 추가했는데, 기존 함수가 문자열 하나만 받아서 테스트에서 오류가 발생했다.

 

그래서 해당 숫자를 대체할 방법으로 슬라이싱을 생각했습니다.

재귀를 문자열의 마지막 부분만 저장하고 나머지 부분을 담는 형태로 구성한다. 

그리고 만약 문자열의 길이가 1이면 그냥 맨 앞자리를 반환해준다. 

이렇게 구성하게 되면 재귀가 문자열이 뒤집어지게 된다.

728x90

'python > 문제' 카테고리의 다른 글

[엘리스] list.sort()사용할 때 None이 반환되는 경우  (0) 2022.07.01
[백준/2231]분해합  (0) 2021.10.28
[백준,10809]알파벳 찾기  (0) 2021.03.04
[백준,2675]문자열반복  (0) 2021.03.04
[백준, 11654] 아스키코드  (0) 2021.03.04
728x90

python으로 문제를 풀면서 배열을 정렬해서 반환해야 하는 경우가 있었다.

처음에 나는 변수A에 array.sort()를 저장해서 A를 반환해주려고 했다.

하지만 A에는 None값이 들어있었다. 

 

구글링을 해보니 sort()는 리스트형의 메소드중에 하나이고, sorted()는 내장 함수라는 사실을 알게 되었다.

기본적으로 메소드는 객체에 안에 포함되어진 함수로, 사용하고자 하는 대상과 .으로 연결되어 있어야 한다.

함수는 그 자체로 정의되어진 것으로, 이름을 통해 호출되면 함수에 따라 매개변수를 입력받는다.

함수는 이름만으로 사용이 가능하지만, 메소드는 대상에 연결되어 있어야만 사용할 수 있다는 점이 가장 큰 차이점이다.

또, 함수는 변수에 값이 들어갈 수 있다는 특징이 있다.

 

sort()와 sorted()로 돌아가면, sort()는 메소드로서 연결된 대상에게 영향을 끼친다고 한다. sorted()는 함수로서 변수에 값을 반환해줄 수 있지만 사용된 매개변수를 정렬시키지는 않는다.

 

 

728x90

'python > 짧은 글' 카테고리의 다른 글

[Python] if ... is (not)  (0) 2022.07.14
728x90

파이썬 문제를 풀면서 해당 문제가 문자열인지 아닌지를 걸러야 하는 경우가 있었다.

처음에는 당연히 비교 연산자를 사용하려고 했는데, is (not)이라는 문법이 적용된다는 것을 알았다.

def hi(sentence):
	if type(sentence) is str:
    	return '문자열입니다'
    elif type(sentence) is not str:
    	return '문자열이 아닙니다'

 

728x90

'python > 짧은 글' 카테고리의 다른 글

[Python] sort()와 sorted(메소드와 내장함수)  (0) 2022.07.14
728x90

간단한 문제를 풀다가 sort()를 사용해서 list를 정렬할 일이 있었다.

def example( _list) :
    _list = _list.sort()
    return _list

print(example([1,2,3])

당연히 정렬된 리스트가 반환될 것이라고 생각했는데 none이 반환되었다. 

 

그래서 구글링을 해보니 sort()는 정렬을 해주긴 하지만 그 값을 리턴해주는 것은 아니라고 한다.  원하는 반환값을 얻기 위해서는 sorted()라는 함수를 추가적으로 사용해야 한다고 한다.

 

def example( _list) :
    _list = sorted(_list)
    return _list

print(example([1,2,3])

 

728x90

'python > 문제' 카테고리의 다른 글

[Python] 재귀호출을 이용한 문자열 뒤집기  (0) 2022.07.20
[백준/2231]분해합  (0) 2021.10.28
[백준,10809]알파벳 찾기  (0) 2021.03.04
[백준,2675]문자열반복  (0) 2021.03.04
[백준, 11654] 아스키코드  (0) 2021.03.04
728x90

◯문제 링크

 

2231/분해합

 

◯코드 미리보기

N = int(input())
K = N
finish = False
_lenN = 0

while 0 < K:
    K //= 10
    _lenN += 1


for i in range(_lenN*9, 0, -1): 
    if  N < i:                  
        continue       
    else :
        M = N - i
        _strM = str(M)
        plusM = 0
        
        for z in range(len(str(M))):
            plusM += int(_strM[z])
        if i == plusM:
            print(M)
            finish = True
            break

if finish == False:
    print(0)

 

 

 

설명

N = int(input())
K = N
finish = False
_lenN = 0

N : 처음에 주어지는 자연수 

K : N의 값을 가지는 변수, 자연수의 길이를 측정하기 위해 사용

(python에서는 str로 변환후에 len을 사용함으로써 더 간단하게 할 수 있지만 다른 언어에서도 사용하기 위해 알고리즘활용)

finish : 분해합이 없는 경우 0을 출력해주기 위해 사용하는 변수

_lenN : 자연수의 길이를 저장하기 위한 변수

 

while 0 < K:
    K //= 10
    _lenN += 1

while문을 활용해서 K의 값이 0보다 같거나 작아질때 까지 10으로 K를 나누고 그 몫을 K에 저장한다. 그 다음 _lenN을 1 증가시킨다. 

while문이 종료되었을 때는 최종적으로 _lenN에 N의 길이가 저장된다.

 

for i in range(_lenN*9, 0, -1): 
    if  N < i:                  
        continue       
    else :
        M = N - i
        _strM = str(M)
        plusM = 0
        for z in range(len(str(M))):
            plusM += int(_strM[z])
            
        if i == plusM:
            print(M)
            finish = True
            break

for문의 시작은 _lenNx9부터 시작하고 0까지 1씩 감소한다.

이렇게 하면 N에서 각 자릿수의 합을 뺀 값인(=N의 생성자인) M의 후보를 가장 큰 작은 값에서 부터 만들수 있기 때문이다. (각 자릿수에서 가장 큰 값은 9이기 때문에)

if문을 사용해서 N의 크기보다 i값이 클경우엔 continue를 실행하게 한다. 

>>N보다 i가 크다는건 각 자릿수의 합이 자연수보다 크다는 것으로 말이 안된다.

N의 크기보다 i값이 작을 경우 N에서 i를 빼서 M을 지정해준다. 

그 다음 M의 각 자릿수의 합을 for문을 통해서 더해준다.

(len(str(M))을 통해서 길이를 구한다음 그만큼 for문 반복을 돌려 각 자릿수를 더한다)

 

이렇게 해서 나온 값이 i(주어진 자연수의 각 자릿수의 합)과 일치한다면, 가장 작은 분해합이 되므로 출력해주고 finish를 True로 바꾸어준다.

 

if finish == False:
    print(0)

만약 분해합이 존재하지 않는 경우에는 0을 출력해준다.

 

배운 것

⩥for문을 거꾸로 사용하는 방법

 1)range를 reversed()로 감싸서 리스트를 뒤집는다

 2)range의 step(3번째 인자)을 -1로 바꿔서 하나씩 감소하게 한다

⩥숫자의 길이를 구하는 알고리즘(python에서 사용하는 것과 다른 언어에서도 사용할 수 있는 것)

728x90
728x90

◯문제 링크

 

[백준,10809]알파벳 찾기

 

◯코드 미리보기

Test_str = input()

alphabet_dict = {}

for i in range(97, 123):
    alphabet_dict[chr(i)] = -1
    
for i in range(len(Test_str)):
    if alphabet_dict[Test_str[i]] == -1:
        alphabet_dict[Test_str[i]] = i
    
Ans = list(alphabet_dict.values())

for i in range(len(Ans)):
    print(Ans[i],end=" ")

설명

Test_str = input()
alphabet_dict = {}

먼저 입력한 문장을 받는 변수이다.

그 뒤에 따라오는 코드는 딕셔너리 선언을 위한 코드이다. 이름에서 알 수 있듯이, 알파벳과 숫자를 같이 정리하기 위한 딕셔너리이다.

 

for i in range(97, 123):
    alphabet_dict[chr(i)] = -1

먼저 아스키 코드를 사용해서 모든 알파벳을 key로 넣어주면서, value를 -1로 할당해 준다.

 

 

for i in range(len(Test_str)):
    if alphabet_dict[Test_str[i]] == -1:
        alphabet_dict[Test_str[i]] = i

다음은 해당 코드를 활용하기 위한 코드이다. 

for문은 문장의 길이만큼 반복을 해준다.

if문과 그 아래 코드는 입력받은 문장에 해당하는 알파벳을 key로 입력했을 때 value가 -1이면 value를 자릿값으로 교체하기 위한 코드이다.

if문을 활용한 이유는, 단어가 여러번 사용되는 경우에는 맨 처음 오는 자릿수만 저장한다고 했기 때문이다. if문의 조건을 충족한다는 것은 그 이전에는 같은 문자가 없었다는 의미이다.

 

Ans = list(alphabet_dict.values())
for i in range(len(Ans)):
    print(Ans[i],end=" ")

다음은 이렇게 정리가 끝난 value값들을 모두 출력해주기 위한 작업이다.

.values()함수를 활용하면 원하는 딕셔너리의 value값들을 list형태로 저장할 수 있다. 다만 이것은 완전한 list는 아니다. 그래서 list로서 사용을 하기 위해서는 list함수로 변환이 이루어져야한다.

for문은 처리가 완료된 value값들을 한줄로 출력해주기 위한 코드이다. print의 end값을 공백 한칸으로 바꾸었다.

 

 

배운 것

⩥딕셔너리의 key와 value는 list형태로 꺼내 올 수 있다. 다만 온전한 list로 사용하려면 list로 변환해주어야 한다.

⩥딕셔너리에 원소를 추가하려면 (딕셔너리 이름)[key] = (value)의 형태로 코드를 짜면 된다.

728x90
728x90

◯문제 링크

 

[백준,2675]문자열반복

 

◯코드 미리보기

Test_case = int(input())

for i in range(Test_case):
    S, P = input().split( )
    S = int(S)
    for k in range(len(P)):
        for z in range(S):
            print(P[k],end="")
    print("")

 

설명

Test_case = int(input())

for i in range(Test_case):

먼저 문제의 반복을 위해서 반복 시킬 만큼의 test case를 입력받는다. 이렇게 입력받은 값은 for문으로 반복시킨다. 

 

그럼 for문의 안을 살펴보자.

    S, P = input().split( )
    S = int(S)

일단 문제에서 주어진 변수를 한 줄로 입력받기 위해서  split을 사용했다.

다만 S부분은 숫자이기 때문에 나중에 정수형을 변환해준다.

 

    for k in range(len(P)):
        for z in range(S):
            print(P[k],end="")

다음은 P의 길이만큼 for문을 돌린다. 이것은 문자열 인덱싱을 사용하기 위해서이다.

for문 안에 for문은 문자를 반복 출력하기 위한 for문이다. 범위는 당연히 S로 지정한다.

마지막줄은 문자를 출력해주는 print문이다. 끝부분에 end의 값을 여백이 없는 것으로 바꾸었는데, 이는 문제에서 원하는 출력을 해주기 위함이다.

 

    print("")

모든 코드가 작동하고 나서 케이스 구분을 해주기 위해서 줄바꿈을 위해 빈 print문을 하나 출력해준다.

 

배운 것

⩥print함수의 변형(end)

 

728x90

'python > 문제' 카테고리의 다른 글

[백준/2231]분해합  (0) 2021.10.28
[백준,10809]알파벳 찾기  (0) 2021.03.04
[백준, 11654] 아스키코드  (0) 2021.03.04
[백준,1011]Fly me to the Alpha Centauri  (0) 2021.02.23
[백준,1065]/한수  (0) 2021.02.22
728x90

◯문제 링크

 

[백준, 11654] 아스키코드

 

◯코드 미리보기


Test_text = ord(input())

print("%s"%Test_text)

 

 

 

 

설명

 

아스키코드에 관한 함수 두가지만 알면 쉽게 풀 수 있는 문제이다.

이 문제에서 사용된 ord함수와 그 짝을 이루는 chr함수이다.

 

ord함수는 괄호안에 입력받은 문자열을 아스키코드로 변환해주는 함수이다. 주의할 점은 str형만 입력이 가능하다는 것이다. 숫자를 입력하고 싶어도 int형태로 입력하면 안되고, str형으로 변환해서 입력해야 한다.

 

chr함수는 괄호 안에 입력받은 정수형을 그 번호에 해당하는 아스키 코드로 변환해주는 함수이다. ord함수와는 반대로, 괄호 안에 int형만 와야한다.

 

 

배운 것

⩥ord함수 : 괄호안에 입력받은 문자열을 아스키코드로 변환해주는 함수

⩥chr함수 : 괄호 안에 입력받은 정수형을 그 번호에 해당하는 아스키 코드로 변환해주는 함수

 

 

 

 

 

 

728x90

'python > 문제' 카테고리의 다른 글

[백준,10809]알파벳 찾기  (0) 2021.03.04
[백준,2675]문자열반복  (0) 2021.03.04
[백준,1011]Fly me to the Alpha Centauri  (0) 2021.02.23
[백준,1065]/한수  (0) 2021.02.22
[백준,4673]셀프 넘버  (0) 2021.02.22

+ Recent posts