728x90
728x90

 내가 푼 과정 

- 먼저 입력 받은 값이 5의 배수가 아닐경우 값에서 3을 빼고 count 를 1증가

- 값이 2보다 작을 경우에는 더이상 3으로 뺄 수 가 없으므로 -1을 반환한다.

 

 소스코드 

 

N = int(input())
result = 0
while True:
    if N%5 !=0 :
        if N <=2:
            result = -1
            break
        N = N -3
        result += 1
    else:
        result += N//5
        break
print(result)

# N = 18
# >>> 4
# N = 4
# >>> -1

역시 응용을 하는데 시간이 좀 걸리는 것 같다.

728x90
728x90

2020년 9월 25일

코딩 테스트를 대비해 개념을 학습 하면서 문제를 풀고 있다.

자료구조와 알고리즘을 배우면서 개념을 이해하고는 있지만, 아직은 문제에 적요하는데에 힘든 부분이 있다.

블로그에 포스팅을 하면서 다시한번 정리해보고자 한다.

 


대소문자 변환

- 파이썬에서 문자열은 문자 단어 들의 집합

- 문자열은 List와 같이 슬라이싱 이나 인덱싱등을 사용할 수 있다.

 upper() 

문자열안의 '소문자'들을 '대문자'로 변환

 

text = 'Hello World'
print(text.upper())

>>>HELLO WORLD

 lower() 

문자열안의 '대문자'들을 '소문자'로 변환

 

text = 'Hello World'
print(text.lower())

>>>hello world

 capitalize() 

문자열의 '첫 글자를 대문자'로 만들고 나머지를 '소문자'로 반환한다.

 

text = 'Hello World'
print(text.capitalize())

>>>Hello world

문자열 비교

 문자열A in 문자열B  

문자열A가 문자열B에 포함되어 있는지 여부를 Boolean 타입으로 반환한다.

 

textA = 'XYPV'
textB='EOGGXYPVSY'
print(textA in textB)

>>>True

 


문자열 조작하기

 문자열[start:end:step] 

 

문자열 슬라이싱 == 리스트 슬라이싱

 

# 길이가 10인 text 를 0~3까지 슬라이싱
text = 'GOFFAKWFSM'
print(text[:4])

>>>GOFF

 문자열[ : : -1]  == 역순

 

문자열 회문 문제 경우 문자열의 순서를 뒤집어야 하는데 이때 슬라이싱을 이용해 역순으로 된 문자열을 구할 수 있다.

 

text = 'GOFFAKWFSM'
print(text[::-1])

>>>MSFWKAFFOG

 

 

 2차원 문자열 리스트의 세로 문자열 구하기 

 

회문 문제에서는 가로에서 일치하는 회문 뿐만 아니라 세로로도 일치하는 문자열을 묻는 경우가 있다.

이떄 2차원 리스트의 요소 접근 방법을 이용해서 기존의 2차원 문자열의 세로문자들로 이루어진 2차원 문자열 리스트를 만들 수 있다.

 

# 10 * 10 인 2차원 문자열 리스트
text_list = ['GOFFAKWFSM',
             'OYECRSLDLQ',
             'UJAJQVSYYC',
             'JAEZNNZEAJ',
             'WJAKCGSGCF',
             'QKUDGATDQL',
             'OKGPFPYRKQ',
             'TDCXBMQTIO',
             'UNADRPNETZ',
             'ZATWDEKDQF']

vertical_text_list = []
for x in range(10):
    text = ''
    for y in range(10):
        text += text_list[y][x]
    vertical_text_list.append(text)

print(vertical_text_list)

>>>['GOUJWQOTUZ', 
    'OYJAJKKDNA', 
    'FEAEAUGCAT', 
    'FCJZKDPXDW', 
    'ARQNCGFBRD', 
    'KSVNGAPMPE', 
    'WLSZSTYQNK', 
    'FDYEGDRTED', 
    'SLYACQKITQ', 
    'MQCJFLQOZF']

 길이가 N인 문자열에서 길이 M만큼 연속 출력 하기

회문 문제에서 길이가 N인 문자열에서 길이가 M인 문자열인 회문을 찾는 경우가 있다.

이때 N과 M은 같을 수도 있거 N>M인 경우 일 수 도 있다.

N = 10 , M = 5 일 경우 M만큼 연속 출력 하는 경우를 알아보자.

 

N = 10
M = 5
text = 'GOFFAKWFSM'

for i in range(N-M+1):
    sub_text = text[i:i+M]
    print(sub_text)
    
>>> GOFFA
>>> OFFAK
>>> FFAKW
>>> FAKWF
>>> AKWFS
>>> KWFSM

 

항상 문제를 풀면서 for문을 사용할 때 헷갈리는 경우는 얼마만큼 for문을 반복해야 하는지이다.

그리고 슬라이싱을 할때 start와 end를 결정하는 경우 인 것 같다. 

위의 예제에서 항상 리스트는 0 부터 시작하고 마지막 end는 총 길이보다 1만큼 작고 , 슬라이싱 또는 range의 경우에는 마지막은 제외 시키는 것을 생각해야한다.

728x90
728x90

파이썬 (Python)

- 2차원 리스트 만들기

리스트 내포 [ List Comprehension] 을 사용하여 2차원 리스트 만들기

 

# 10 x 10 2차원 배열

# 1차원 리스트

lista = [ i for i range(10)]

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 2차원 리스트

listb = [lista for _ range(10)]

>>> [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], ...]

listb = [ [ i for i in range(10) ] for _ in range(10)]

>>>[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], ...]

 

- 2차원 리스트 요소 접근

list[j][i]

 

#2차원 리스트 요소 접근 

for i in range(10):
	for j in range(10):
    	data = list[j][i]
        

 

- 2차원 리스트 출력

for y in range(len(listb)):
    for x in range(len(listb)):
        print(listb[y][x],end=' ')
    print('')
    
    
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 9 

 

- 비트 연산자를 이용한 부분 집합 구하기

list = [1,2,3,4,5]

 

list = ['a','b','c']
n = len(list)
for i in range(1<<n):

    for j in range(n):
        if i & (1<<j):
            print(list[j],end=' ')
    print(' ')


a  
b  
a b  
c  
a c  
b c  
a b c  

- 부분 집합 리스트에 담기 

list = ['a','b','c']
n = len(list)
set_list = []
for i in range(1<<n):
    sub_set_list = []
    for j in range(n):
        if i & (1<<j):
            sub_set_list.append(list[j])
    set_list.append(sub_set_list)
print(set_list)

[[], ['a'], ['b'], ['a', 'b'], ['c'], ['a', 'c'], ['b', 'c'], ['a', 'b', 'c']]

- 4자리 2진수 표현하기

num = 10
m , n = 0,0
result = ''
for i in range(4):
    m =num//2
    n =num%2
    result = str(n) + result
    num = m
print(result)

>>>1010

- 16진수를 2진수 표현하는 문제  

 

conversion = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
decimal_number = "45DF"
def binary(num):
    m , n = 0,0
    result = ''
    for i in range(4):
        m =num//2
        n =num%2
        result = str(n) + result
        num = m
    return result

final_list = ''
for i in decimal_number:
    result = binary(conversion[i])
    final_list += result
print(final_list)

>>> 0100010111011111

 

- 0 보다 크고 1 미만인 실수인 10 진수 > 2진수로 표현

num = 0.625
result =''
while True:
    next_num = num*2
    result += str(int(next_num))
    num = next_num - int(next_num)
    if num == 0.0:
        break
print('0.'+result)

>>> 0.101

 

728x90
728x90
728x90

+ Recent posts