잘 쓰면 좋은 것!!!
- for에 바로 배열 넣기
for i in arr
arr 요소를 하나씩 꺼내옴
그냥 문자열 순회하는거는 이거 쓰셈 제발.
- sorted
return(sorted(arr, reverse=True))
이건 바로 return 값에 쓸 수 있음
- 숫자 하나를 내림차순 배열?하기
ex) 14635 -> 65431
n = 12345
arr = list(map(int, str(n))) # 1. [1, 2, 3, 4, 5] 먼저 str로 문자열로 바꿔서 map을 통해서 int로 각 요소를 바꾸고 다시 리스트로 변환
arr.sort(reverse=True) # 2. [5, 4, 3, 2, 1] 내림차순
# 3. 숫자를 다시 문자로 바꿔서 합치기! 중요한 점은 join은 문자열만 가능하기때문에 map을 통해 다시 str로 바꾸고 int로 다시 감싸준다
return int("".join(map(str, arr)))
- 빈 array
array = []
array.append(1) # 무조건 append해서 값 넣어야해
array[0] = 1 #XXXXX 절대 불가 XXXXXX
빈 array는 바로 접근 못함
- split()
answer=s.split(" ")
ex) "try hello world"
['try', 'hello', 'world']
문자열 split()은 그냥 리스트로 만들어줌!!!!!!!!!
정수 같은 애들은 map과 list 사용하는데 문자열은 그냥 바로 list 만들어줌
1. 정수 제곱근 판별

사용되야하는 것: 거듭제곱근 개념
내 풀이
# ? ** x = n ->
def solution(n):
x=0
x=int(n**0.5)
if (x**2 == n):
return (x+1)**2
else:
return -1
x**2가 거듭제곱이니까 그 근을 구하려면 2 자리에 1/2(0.5)가 들어가면 된다.
또 다른 방법
import math
x=int(math.sqrt(n))
math를 import해서 sqrt를 쓰면 바로 제곱근을 구할 수 있다.
이때도 실수로 출력되기 때문에 정수변환 필수
x=int(pow(n, 0.5))
pow(n, p)는 n의 p제곱을 구하는 것
p 자리에 0.5가 들어가면 제곱근
정수변환 해줘야함
2. 나누어 떨어지는 숫자 배열

사용되어야 하는 것: .sort, sorted([리스트])
내 풀이
def solution(arr, divisor):
new_arr=[]
for i in range(len(arr)):
if arr[i] % divisor == 0:
new_arr.append(arr[i])
else:
continue;
if len(new_arr) == 0:
new_arr.append(-1)
return new_arr
else:
new_arr.sort()
return new_arr
... 너무 길다
이전에 쭉 자바를 써오다가 파이썬으로 바꾸니 아직 자바스러운 코드가 나온다
그래서 너무 길어진다
또 다른 방법
def solution(arr, divisor):
new_arr=[]
for i in arr:
if i%divisor == 0:
new_arr.append(i)
if new_arr==[]: return [-1]
new_arr.sort()
return new_arr
for문에 len(arr)쓸 필요 없고 바로 배열 갖다 넣으면 그 배열을 순차적으로 돈다.
return도 값이 하나 딱! 정해져있으면 append 할 필요 없고 바로 [-1]로 리턴하면 된다.
def solution(arr, divisor): return sorted([n for n in arr if n%divisor == 0]) or [-1]
sorted([배열]) 메소드를 쓰면 바로 리턴값에 넣을 수 있다
3. 수박수박수박수박수박수?

내 풀이
def solution(n):
arr = []
for i in range(1, n+1):
if i%2 == 1:
arr.append('수')
else:
arr.append('박')
return "".join(arr)
내 풀이도 나쁘지 않다고 생각하지만
또 다른 방법
def solution(n):
s='수박'*n
return s[:n]
진짜 이런 방법은 어떻게 생각하는거지?
4. 제일 작은 수 제거하기

사용해야하는 것: min, remove
이 문제는 사실 어렵지 않은데 내가 몰랐던 메소드들이 있길래 작성함
내 풀이
def solution(arr):
small=min(arr)
arr.remove(small)
return [-1] if len(arr)==0 else arr
min으로 그 배열에서 가장 작은 수 찾기
remove를 통해서 그 요소만 지우기
5. 내적

이 문제도 풀긴했는데 새로운 개념을 알아서 작성해본다
내 풀이
def solution(a, b):
return sum(a[i]*b[i] for i in range(len(a)))
이렇게 해도 되지만
또 다른 풀이
def solution(a, b):
return sum([x*y for x, y in zip(a,b)])
* 여기서 zip 함수가 뭘까?
zip() 함수는 이름 그대로 **'지퍼(Zipper)'**처럼 두 개 이상의 보따리(리스트, 튜플 등)를 같은 인덱스끼리 짝을 지어 묶어주는 아주 유용한 도구
1. 기본 사용법
두 개의 리스트가 있을 때, 같은 순서에 있는 데이터끼리 튜플 () 형태로 묶어줍니다.
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 95]
# zip으로 묶기
zipped = zip(names, scores)
# 결과를 보기 위해 리스트로 변환
print(list(zipped))
# 결과: [('Alice', 85), ('Bob', 90), ('Charlie', 95)]
2. for문과 함께 쓸 때 (가장 많이 씀!)
여러 리스트를 동시에 돌면서 값을 꺼내고 싶을 때 range(len())을 쓰는 대신 zip을 쓰면 코드가 훨씬 깔끔해집니다.
names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 95]
for name, score in zip(names, scores):
print(f"{name}의 점수는 {score}점입니다.")
# 출력:
# Alice의 점수는 85점입니다.
# Bob의 점수는 90점입니다.
# Charlie의 점수는 95점입니다.
3. 길이가 서로 다르면 어떻게 되나요?
zip은 아주 냉정한 친구라, 가장 짧은 리스트의 길이에 맞춰서 나머지는 버려버립니다.
arr1 = [1, 2, 3]
arr2 = ["A", "B"]
print(list(zip(arr1, arr2)))
# 결과: [(1, 'A'), (2, 'B')] <-- 3은 짝이 없어서 버려짐!
아까 그 코드를 다시 보면
def solution(a, b):
return sum([x*y for x, y in zip(a,b)])
둘이 짝 지어서 배열에 넣은 것을 볼 수 있다..
map은 리스트를 만들어주는 기계가 아니라 "알맹이들을 하나씩 변신시키는 마법사"
s = "123"
# list()로 안 감싸도 sum이 알아서 하나씩 꺼내서 더해줍니다.
total = sum(map(int, s))
print(total) # 6
map은 123 문자열을 하나씩 꺼내줌. 1, 2, 3을 각각 int로 만들어준다. 근데 이게 리스트로 된건 아님! 그냥 알맹이만 하나씩 뽑아온거
6. 문자열 다루기 기본

풀이
# s가 숫자로만 구성된 길이 4, 6일때만 True 리턴
def solution(s):
if len(s) == 4 or len(s) == 6:
answer = True
else:
return False
for i in s:
if (i>='a' and i<='z') or (i>='A' and i<='Z'):
answer=False
return answer
i가 문자열인지 아닌지 확인하려면 저렇게 i가 a와 z 사이인지 확인하면 됨!
또 다른 풀이
def alpha_string46(s):
return s.isdigit() and len(s)==4 or len(s)==6
isdigit()은 문자열(str) 속에 들어있는 내용이 "오직 숫자로만 이루어져 있는지" 확인해주는 아주 기특한 도구입니다.
isdigit()는 Ture 또는 False로만 값을 반환한다
마이너스(-) or 소수점(.) or 공백이 하나라도 들어가면 'False'가 나온다
7. 행렬의 덧셈

풀이
def solution(arr1, arr2):
answer = []
for i in range(len(arr1)):
row=[]
for j in range(len(arr1[0])):
row.append(arr1[i][j] + arr2[i][j])
answer.append(row)
return answer
1. 먼저 1행의 것을 만든다
2. 1행의 것이 다 계산되면 추가하고 이제 2행의 것을 만들고 추가한다.
또 다른 방법
def sumMatrix(A,B):
for i in range(len(A)):
for j in range(len(A[0])):
A[i][j] += B[i][j]
return A
따로 배열을 만들지 않고 그냥 A 배열에 바로 더해도 된다.
def solution(arr1, arr2):
answer = [[c + d for c, d in zip(a,b)] for a, b in zip(arr1,arr2)]
return answer
1. for a, b in zip(arr1, arr2)
- arr1의 첫 번째 요소([1, 2])로 지정된 a와 arr2의 첫 번째 요소로 지정된 b([2, 3])를 묶음
- 그니까 arr1 첫 봉투의 알맹이를 a(1, 2), arr2 첫 봉투의 알맹이를 b라고 둠(2, 3)
2. [c + d for c, d in zip(a,b)]
- a의 첫 알맹이 1를 c, b의 첫 알맹이 2를 d라고 두고 그 다음 알맹이 실행
3. 끝나면 다시 첫 번째 for문으로 돌아가서 두 번째 봉투 다시 순서대로..
8. 별찍기

풀이
a, b = map(int, input().strip().split(' '))
print(('*'*a + '\n') * b)
개행 문자 사용을 생각 못 함..
a, b = map(int, input().strip().split(' '))
for i in range(b):
print('*'*a)
print(a)
print(a)
하면
a
a
이렇게 다음줄로 실행
9. 두 개 뽑아서 더하기

필요한 개념: in (특정 요소가 배열에 포함되있는가?)
풀이
def solution(numbers):
answer = []
for i in range(len(numbers)-1):
for j in range(i+1, len(numbers)):
if numbers[i]+numbers[j] not in answer:
answer.append(numbers[i]+numbers[j])
answer.sort()
return answer
새로 담을 answer에 담으려는 값이 없을 때 append를 해서 담아줘야한다.
이때 쓰인 개념이 not in인데, '요소 in 배열'은 배열 안에 그 요소가 있으면 true를 반환한다.
def solution(numbers):
answer = []
for i in range(len(numbers)):
for j in range(i+1, len(numbers)):
answer.append(numbers[i] + numbers[j])
return sorted(list(set(answer)))
이것처럼 일단 다 더하고 마지막에 set으로 중복요소만 제거하는 방법도 있다!
10. 이상한 문자 만들기

def solution(s):
answer=s.split(" ") # ['try', 'hello', 'world']
final_answer=[]
for i in answer:
result=[]
for j in range(len(i)):
if j%2==0:
result.append(i[j].upper())
else:
result.append(i[j].lower())
final_answer.append("".join(result))
return (" ".join(final_answer))
여기서 쓰이는 중요한 개념은 문자열 split은 바로 리스트로 변환해주는 것
for i in answer을 통해 문자열에 바로 접근하는 것