카테고리 없음

[프로그래머스] 레벨 1 먼저 풀어보기 (1)

chaewot 2026. 4. 5. 11:30

잘 쓰면 좋은 것!!!

  • 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을 통해 문자열에 바로 접근하는 것