Day10 문자열

  • 문자열의 앞의 n글자
  • 접두사인지 확인하기
  • 문자열 뒤집기
  • 세로 읽기
  • qr code

문자열 앞의 n글자

문제 설명

문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string의 앞의 n글자로 이루어진 문자열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, n):
    return my_string[:n]

 


접두사인지 확인하기

문제 설명

어떤 문자열에 대해서 접두사는 특정 인덱스까지의 문자열을 의미합니다. 예를 들어, "banana"의 모든 접두사는 "b", "ba", "ban", "bana", "banan", "banana"입니다.문자열 my_string과 is_prefix가 주어질 때, is_prefix가 my_string의 접두사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, is_prefix):
    return int(my_string[:len(is_prefix)] == is_prefix)

 

 

def solution(my_string, is_prefix):
    return 1 if my_string.find(is_prefix) == 0 else 0

다른 사람 풀이 : find 함수를 이용해서도 풀 수 있구나


문자열 뒤집기

문제 설명

문자열 my_string과 정수 s, e가 매개변수로 주어질 때, my_string에서 인덱스 s부터 인덱스 e까지를 뒤집은 문자열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, s, e):
    t = len(my_string)
    start = t-e
    end = t-s
    answer = my_string[:s] + my_string[-start:-(end+1):-1] + my_string[e+1:]
    return answer

문자열 뒤집기 며칠 전에 문제 풀었었는데,,, 어떻게 풀었는지 기억이 안났음

뒤집기를 어떻게 할까 고민하다가 "전체길이에서 s, e 뺀 길이로 음수인덱스 사용하자" 하고 생각해낸 .. 

def solution(my_string, s, e):
    return my_string[:s]+my_string[s:e+1][::-1]+my_string[e+1:]

그리고 기억난 문자열 뒤집기 방법 .. [::-1] 하나면 되는데 이게 기억이 안나서 ㅋㅋㅋㅋㅋㅋ


세로 읽기

문제 설명

문자열 my_string과 두 정수 m, c가 주어집니다. my_string을 한 줄에 m 글자씩 가로로 적었을 때 왼쪽부터 세로로 c번째 열에 적힌 글자들을 문자열로 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, m, c):
    answer = ''
    new = [my_string[i:i+m] for i in range(0, len(my_string), m)]
    return ''.join([i[c-1] for i in new])

반복문에서 증가하는 크기를 m만큼 잡고, 슬라이싱을 [i : i+m]해서 m의 길이만큼 자른다.

i = 0, 4, 8, 12 ... 

i+m = 4, 8, 12, 16 ...

m개씩 슬라이싱되는 것을 알 수 있음

이후 c번째 인덱스를 구함. 인덱스는 0부터 시작하기 때문에 c번째 값을 구하고 싶으니 c-1

def solution(my_str, m, c):
    return my_str[c-1::m]

다른 사람 풀이 : 

생각보다 꽤 오래 고민했는데 .... 이런 풀이보면 진짜 허무해지는 것 같음

사실 저렇게 슬라이싱하는 방법을 몰랐음 애초에 ..

my_str[c-1::m]
문자열 my_str에서 c-1 번째 인덱스부터 시작하여 m 간격으로 문자를 선택
c-1 : 시작 인덱스
m : 간격(m만큼의 간격으로 슬라이싱)
def solution(my_string, m, c):
    answer = ''
    for i in range(c-1,len(my_string),m): answer+=my_string[i]
    return answer

좀 더 나은(?) 코드라고 생각한 것

c-1부터 m 간격으로 문자를 선택하며 반복

그럼 내가 구하고자 하는 값은 항상 i번째 인덱스에 있음.


qr code

문제 설명

두 정수 q, r과 문자열 code가 주어질 때, code의 각 인덱스를 q로 나누었을 때 나머지가 r인 위치의 문자를 앞에서부터 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

def solution(q, r, code):
    return ''.join([code[i] for i in range(len(code)) if i % q == r])

 


다른 건 난이도가 ... 갑자기 낮아진 느낌인데 세로 읽기 문제에서 막혔다.

계속 슬라이싱하는 문제만 풀어서 그런지 슬라이싱으로만 생각해서 좀 오래걸린 것 같다

문자열 슬라이싱할 때 > 반복문 간격 설정 ... 활용하면 쉽다. 하하

Day9 문자열

  • 배열 만들기 5
  • 부분 문자열 이어 붙여 문자열 만들기
  • 문자열 뒤의 n글자
  • 접미사 배열
  • 접미사인지 확인하기

배열 만들기 5

문제 설명

문자열 배열 intStrs와 정수 k, s, l가 주어집니다. intStrs의 원소는 숫자로 이루어져 있습니다.배열 intStrs의 각 원소마다 s번 인덱스에서 시작하는 길이 l짜리 부분 문자열을 잘라내 정수로 변환합니다. 이때 변환한 정수값이 k보다 큰 값들을 담은 배열을 return 하는 solution 함수를 완성해 주세요.

def solution(intStrs, k, s, l):
    answer = []
    for i in intStrs:
        intList = list(i)
        res = ''.join(intList[s:s+l])
        if int(res) > k:
            answer.append(int(res))
    return answer

이것저것 형변환을 많이 사용한 것 같다. 생각해보니 리스트로 변환할 것 없이 문자열 자체를 슬라이싱하면 되는데 왜 리스트로 변환해서 슬라이싱 할 생각을 했지 . .ㅎㅎ

 

def solution(intStrs, k, s, l):
    return [int(intstr[s:s+l]) for intstr in intStrs if int(intstr[s:s+l]) > k]

다른 사람 풀이 :

문자열을 바로 슬라이싱해서 int로 변환하고, 조건문으로 값이 k 이상인 값들만 뽑아냈다. 굿굿.. 


부분 문자열 이어 붙여 문자열 만들기

문제 설명

길이가 같은 문자열 배열 my_strings와 이차원 정수 배열 parts가 매개변수로 주어집니다. parts[i]는 [s, e] 형태로, my_string[i]의 인덱스 s부터 인덱스 e까지의 부분 문자열을 의미합니다. 각 my_strings의 원소의 parts에 해당하는 부분 문자열을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_strings, parts):
    answer = ''
    for i in range(len(my_strings)):
        answer += my_strings[i][parts[i][0]:parts[i][1]+1]
    return answer

my_strings와 parts의 길이가 같고, 같은 인덱스 안의 값들을 사용하는 것이므로 인덱스를 활용하려고 생각하며 풀었다.

한번에 풀려고 하지 않고 하나하나 해석하면서 푸니까 좀 더 빨리 풀리는 듯!

def solution(my_strings, parts):
    answer = ""
    for i, (s, e) in enumerate(parts):
        answer += my_strings[i][s:e+1]
    return answer

다른 사람의 좀 더 간단한 풀이, enumerate 함수도 잘 사용하면 유용한 것 같다.


문자열의 뒤의 n글자

문제 설명

문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string의 뒤의 n글자로 이루어진 문자열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, n):
    return my_string[-n:]

음수 인덱스 사용해서 문자열 뒤에서부터 슬라이싱 !


접미사 배열

문제 설명

어떤 문자열에 대해서 접미사는 특정 인덱스부터 시작하는 문자열을 의미합니다. 예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다.문자열 my_string이 매개변수로 주어질 때, my_string의 모든 접미사를 사전순으로 정렬한 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string):
    return sorted([my_string[i:] for i in range(len(my_string))])

인덱스 0부터 +1씩 문자열 슬라이싱 > 사전순으로 정렬


접미사인지 확인하기

문제 설명

어떤 문자열에 대해서 접미사는 특정 인덱스부터 시작하는 문자열을 의미합니다. 예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다.문자열 my_string과 is_suffix가 주어질 때, is_suffix가 my_string의 접미사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, is_suffix):
    lst = [my_string[i:] for i in range(len(my_string))]

    return 1 if is_suffix in lst else 0

방금 푼 물제에 조건문만 붙여서 접미사 배열 안에 해당 접미사가 있는지만 확인하여 1, 0 리턴

def solution(my_string, is_suffix):
    return int(my_string.endswith(is_suffix))

다른 사람 풀이:

endswith 함수는 문자열이 특정 접미사로 끝나는지 여부를 확인하는 파이썬의 문자열 메서드
특정 접미사로 끝나면 True를 반환하고, 그렇지 않으면 False를 반환

 

endswith 함수를 사용해서 바로 답을 낼 수도 있었다 .. ㄷㄷ!

내가 모르는 함수 왜이리 많은지

def solution(my_string, is_suffix):
    return int(my_string[-len(is_suffix):] == is_suffix)

또 신박하다고 생각했던 풀이는

접미사 배열 안에 is_suffix의 길이와 같은 값을 구하고 이를 is_suffix와 비교하는 것


어제는 한문제를 한시간 넘게 풀어서 거의 총 3시간을 소요했는데 오늘은 또 난이도가 낮아서 금방 풀었다.

할 건 많은데 알고리즘은 시간이 얼만큼 소요될지 모르니까 빨리 끝나는 날엔 시간을 번 것 같고,

늦게 끝나는 날엔 시간을 빼앗긴 느낌이다 ㅋㅋㅋㅋㅋ 나만 그런게 아니겠지 ..! 

앞으로 난이도가 점점 더 올라갈텐데 ,, 꾸준히 하다보면 그래도 훨씬 실력이 좋아지지 않을까 ?

아무튼 오늘은 빨리 끝나서 기분이 좋다.. 얼른 다른 할 일 청산하러 가야지

Day8

  • 간단한 논리 연산
  • 주사위 게임 3
  • 글자 이어 붙여 문자열 만들기
  • 9로 나눈 나머지
  • 문자열 여러 번 뒤집기

간단한 논리 연산

문제 설명

boolean 변수 x1, x2, x3, x4가 매개변수로 주어질 때, 다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요.
(x1 ∨ x2) ∧ (x3 ∨ x4)

 

def solution(x1, x2, x3, x4):
    return (x1 or x2) and (x3 or x4)

 


주사위 게임 3

문제 설명

1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

 

며칠 전에 풀었던 주사위 게임 풀이에서 set 함수로 중복된 값을 추리고 len 함수로 개수를 알아내 문제를 풀었던 기억이 있다. 이 방식으로 접근해보았을 때

  • p p p p > 1
  • p p p q > 2
  • p p q q > 2
  • p p q r > 3
  • p q r t > 4

> 값이 2로 동일할 때 어떻게 구분할 것인가?

> p p q r 일 때의 연산이 q * r 인데 어떤게 p,q,r을 어떻게 구분할 것인가? 의 문제가 생겼다 ..... 음

def solution(a, b, c, d):
    answer = 0
    lst = [a,b,c,d]
    length = len(set(lst))
    count = [lst.count(i) for i in lst]

    if length == 1: answer = 1111 * a
    elif length == 4 : answer = min(a,b,c,d)
    elif length == 2:
        if 3 in count:
            p = [lst[index] for index, value in enumerate(count) if value == 3]
            q = [lst[index] for index, value in enumerate(count) if value == 1]
            answer = (10 * p[0] + q[0])**2
        else:
            answer = (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b)

    else:
        answer_values = [lst[index] for index, value in enumerate(count) if value == 1]
        answer = answer_values[0] * answer_values[1]

    return answer

머리 쥐어짜내가며 짠 코드 ..뇌절코드.. 한시간 넘게 걸려서 짠......코드예요 ....

 

1. length가 2일 때

1-1. p p p q 인 경우 count가 3임

1-2. p p q q 인 경우, a==b면 c==d이기 때문에 어차피 값이 2개밖에 없으니 a,c를 p,q로 활용해서 연산

2. length가 3일 때, p p q r 인 경우

count값이 1 > q, r 을 구해야하므로

값이 1을 만족할 때의 인덱스를 사용해서 lst에서 값을 구함.

 

아우 어렵게도 짰다 그쵸 .. 

암튼  [lst[index] for index, value in enumerate(count) if value == n] 이 코드를 위주로 생각해서 짰고,

value가 n을 만족할 때의 인덱스를 사용해서 값을 구한 것입니다!

def solution(a, b, c, d):
    l = [a,b,c,d]
    c = [l.count(x) for x in l]
    print(c)
    if max(c) == 4:
        return 1111*a
    elif max(c) == 3:
        print(l[c.index(3)])a
        return (10*l[c.index(3)]+l[c.index(1)])**2
    
    elif max(c) == 2:
        if min(c) == 1:
            return eval('*'.join([str(l[i]) for i, x in enumerate(c) if x == 1]))
        else:
            return (max(l) + min(l)) * abs(max(l) - min(l))
    else:
        return min(l)

다른 사람 풀이:

애초에 4,3,2,1의 기준값을 나눈 것부터 나랑 달랐다.

나는 set을 기준으로 나누었는데 다른사람들은 count함수를 기준으로 나누었다.

다른 부분이 예를들어 p p p q 라면 set은 > p, q만남고 값이 2가 되는데

count를 사용해서 lst 배열대로 남겨두 [3, 3, 3, 1]이 되어 max(c)를 하였을 때 값이 3이 나온다.

이렇게 해야 뒤에서 인덱스를 구할 때 편해서 이 방법이 훨씬 ... 나은 것 같다.

내가 푼 방법은 하나하나 계산을 한 느낌이랄까 ....

 

count랑 index함수를 사용한 풀이를 제대로 처음본 것 같다.

 

c = [l.count(x) for x in l] : 리스트의 특정 원소 개수를 세서 c에 저장한다.

1. max(c) == 4일 때, 특정 원소 개수가 4개일 때 > 모두 같은 값 

2. max(c) == 3일 때, 특정 원소 개수가 3개일 때 > 3개 같은 값, 1개만 다름

3. max(c) == 2일 때

3-1 min(c)는 1일 때 p p q r 인 경우

c의 값이 1일 때의 인덱스를 구해서 두 값을 곱함

3-2 p p q q 인 경우

값이 어차피 2개이니 list에서 최솟값과 최댓값을 이용해 p, q로 보고 계산

 

어려운데 .. 그래도 새로운 것을 알아가는 것 같아서 좋슴니다. 

비록 제 시간은 훅.. 날아가버렸지만요 ㅠ


글자 이어 붙여 문자열 만들기

문제 설명

문자열 my_string과 정수 배열 index_list가 매개변수로 주어집니다. my_string의 index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, index_list):
    return ''.join(my_string[i] for i in index_list)

9로 나눈 나머지

문제 설명

음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.

 

def solution(number):
    return int(number) % 9

사실 그냥 이렇게 풀었는데

이렇게 푸는 게 정석은 아니었나보다.

def solution(number):
    return sum(list(map(int, number))) % 9

문제에서 팩트는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것

 


문자열 여러 번 뒤집기

문제 설명

문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string, queries):    
    for s, e in queries:
        my_string = my_string.replace(my_string[s:e+1], my_string[s:e+1][::-1])
    return my_string

인덱스 s~e 부분을 뒤집어서 replace함수로 대체하는 방법을 사용했는데, 반례가 계속 나와서 결국 방법을 바꿨다.

def solution(my_string, queries):    
    for s, e in queries:
        my_string = my_string[:s] + my_string[s:e+1][::-1] + my_string[e+1:]
    return my_string

replace 함수를 사용하지 않고 슬라이싱만 이용해서 s~e부분을 뒤집고 앞뒤로는 그대로 가져가기


문제들 난이도가 오락가락하는게 병주고 약주는 건가 ..... 주사위 문제에서 멘탈나갔는데 3,4,5는 그래도 순탄히 풀리고,, 이게 완전 기초일텐데 다른 건 얼마나 어려울까 .....ㅎㅎㅎㅎㅜㅜㅜ 어제 삼전 sw 어쩌고 신청을 해놔서 사전 문제 풀려고 봤는데 진짜 도저히 모르겠더라고요 ..... 그래두 꾸준히 해보자 아자잣

Day7

  • 수열과 구간 쿼리 4
  • 배열 만들기 2
  • 카운트 업
  • 콜라츠 수열 만들기
  • 배열 만들기 4

수열과 구간 쿼리 4

문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 i가 k의 배수이면 arr[i]에 1을 더합니다.위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

def solution(arr, queries):
    for s, e, k in queries:
        for i in range(s, e+1):
            if i % k == 0:
                arr[i] += 1
    return arr

어제 문제랑 비슷해서 손쉽게 푸나 했더니 비슷한듯 다른 문제... 

인덱스 s~e까지 자르는게 아니라 배열은 그대로 가져가되

s~e까지만 반복하고, 그 안에서 i가 k의 배수일 때, 해당하는 배열에만 1을 더했다.


배열 만들기 2

문제 설명

정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.

 

def solution(l, r):
    answer = []
    Xlist= set(['1','2','3','4','6','7','8','9'])
    for i in range(l, r+1):
        num = set(str(i))
        if num & Xlist:
            pass
        else:
            answer.append(i)
    if not answer:
        answer.append(-1)
    return answer

Xlist와 l~r사이의 숫자 중에 교집합이 있으면(0, 5가 아닌 값이 있으면) pass

교집합이 없으면 (0, 5만 남아있을테니) 그때의 값을 answer에 append하기

def solution(l, r):
    answer = []
    for num in range(l, r + 1):
        if not set(str(num)) - set(['0', '5']):
            answer.append(num)
    return answer if answer else [-1]

다른 사람 풀이:

 if not set(str(num)) - set(['0', '5']): 값을 집합으로 표현하고

집합 - 집합 = 비어있으면 >> 1,2,3,4,6,7,8,9의 값이 없다는 것이니 그때의 값을 배열에 저장

이런 신박한 방법을 어찌 생각해내시는지.....


카운트 업

문제 설명

정수 start_num와 end_num가 주어질 때, start_num부터 end_num까지의 숫자를 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(start, end):
    answer = []
    for i in range(start, end+1):
        answer.append(i)
    return answer

응? 갑자기 이렇게 쉬운게 나와버린다고? 감사합니다.

def solution(start, end):
    return list(range(start, end + 1))
    
def solution(start, end):
    return [i for i in range(start, end+1)]

파이썬은 사기야 .. 코드를 효율적으로 줄여쓰는 연습을 해보자 .....!


콜라츠 수열 만들기

문제 설명

모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.
def solution(n):
    answer = [n]
    
    while n != 1:
        if n % 2 == 0:
            n //= 2
        else:
            n = 3 * n + 1
        answer.append(n)
            
    return answer

1. n이 1일 때까지 무한 반복

2. 짝, 홀수일 때 연산다르게 하고, 배열에 값 저장


배열 만들기 4

문제 설명

정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만드려고 합니다.변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.

 

def solution(arr):
    stk = []
    i = 0
    while i < len(arr):
        if not stk:
            stk.append(arr[i])
            i += 1
        elif stk and stk[-1] < arr[i]:
            stk.append(arr[i])
            i += 1
        else:
            stk.pop()

    return stk

문제 읽으면서 코드썼는데 정답이라 기뻐했는데 if, elif문 실행부분 똑같네 ......요.......ㅎ

정신 몽롱한 상태로 푸는 것은 좋지 않습니다 ...... 그래도 이제 잘 수 있어 기뻐요!

def solution(arr):
    stk = []
    
    for i in range(len(arr)):
        while stk and stk[-1] >= arr[i]:
            stk.pop()
        stk.append(arr[i])
            
    return stk

while문으로 먼저 조건에 만족하는 원소들을 모두 지운 후,

마지막 남은 원소들 모두 추가. 끝!


 

Day6

  • 마지막 두 원소
  • 수 조작하기 1
  • 수 조작하기 2
  • 수열과 구간 쿼리 3
  • 수열과 구간 쿼리 2

마지막 두 원소

문제 설명

정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list):
    if num_list[-1] > num_list[-2]:
        num_list.append(num_list[-1] - num_list[-2])
    else:
        num_list.append(num_list[-1] * 2)

    return num_list

 

def solution(l):
    l.append(l[-1]-l[-2] if l[-1]>l[-2] else l[-1]*2)
    return l

삼항 연산자로 간단하게도 가능


수 조작하기 1

문제 설명

정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다."w" : n이 1 커집니다."s" : n이 1 작아집니다."d" : n이 10 커집니다."a" : n이 10 작아집니다.위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.

 

def solution(n, control):
    for i in control:
        if i == "w": n += 1
        elif i == "s": n -= 1
        elif i == "d": n += 10
        else: n -= 10
    return n

제일 많은 정석적인.. 풀이? 인듯

def solution(n, control):
    answer = n
    c = { 'w':1, 's':-1, 'd':10, 'a':-10}
    for i in control:
        answer += c[i]
    return answer

딕셔너리를 이용해서 키-값으로 더한 풀이, 신박하다


수 조작하기 2

문제 설명

정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다."w" : 수에 1을 더한다."s" : 수에 1을 뺀다."d" : 수에 10을 더한다."a" : 수에 10을 뺀다.그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.

 

def solution(numLog):
    answer = ''
    for i in range(1, len(numLog)):
        if numLog[i-1] + 1 == numLog[i]:
            answer += "w"
        elif numLog[i-1] - 1 == numLog[i]:
            answer += "s"
        elif numLog[i-1] + 10 == numLog[i]:
            answer += "d"
        else:
            answer += "a"
    return answer

전 문제랑 비슷한듯 어려움

나는 현재값 +n이 다음값과 같다면 ~ 이런식으로 해석하고 풀었는데

def solution(numLog):
    answer = ''
    for i in range(1, len(numLog)):
        dif = numLog[i] - numLog[i - 1]
        if dif == 1:
            answer += 'w'
        elif dif == -1:
            answer += 's'
        elif dif == 10:
            answer += 'd'
        elif dif == -10:
            answer += 'a'
        else:
            pass
    return answer​

다른 사람들은 이런식으로 현재값과 이전값의 차이를 이용해서 구한 것 같다.

이런 문제 풀 때, 인덱스에러 나만 많이 나오나.. 주의해가며 풀어야겠다.


수열과 구간 쿼리 3

문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.
def solution(arr, queries):
    for query in queries:
        for i in range(1, 2):
            j = query[i-1]
            k = query[i]
            arr[j], arr[k] = arr[k], arr[j]
    return arr

중첩 반복문 .. 이런 문제에 쓰면 안된다는 것을 알지만 해결법이 떠오르지 않았어 ㅠ

def solution(arr, queries):
    for a,b in queries:
        arr[a],arr[b]=arr[b],arr[a]
    return arr

다른 사람 풀이:

반복문 이렇게 두 개의 값을 가져올 수 있는지.. 몰랐어요 ~~^^

쿼리 안의 쿼리를 인덱스로 이용해서 리스트 원소 교환


수열과 구간 쿼리 2

문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

def solution(arr, queries):
    answer = []
    temp = []
    for s,e,k in queries:
        new_arr = arr[s:e+1]
        temp = [i for i in new_arr if i > k]

        if temp:
            value = min(temp)
            answer.append(value)
        else:
            answer.append(-1)

    return answer

아오 .....어렵다 .....ㅠㅠ 힌트랑 이것저것 도움받고 결국 성공 ...

1. arr 배열을 인덱스 s~e까지 자르기

2. 잘린 배열을 반복문을 통해 k보다 큰 값 찾아서 temp에 넣기

3. temp가 비어있지 않을 때, temp의 최솟값 찾기, 비어있으면 answer은 -1

4. 최솟값을 최종값으로 저장 answer에 담기

5. answer 반환 끝........

 

ㅠㅠ 머리가 굳었나봐요 5문제 푸는 시간이 점점 길어지고 있다 ....... 

오늘은 약 두 시간 반정도 소요 ....

 

Day5

  • 코드 처리하기
  • 등차수열의 특정한 항만 더하기
  • 주사위 게임2
  • 원소들의 곱과 합
  • 이어 붙인 수

코드 처리하기

문제 설명

문자열 code가 주어집니다.code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.mode가 0일 때code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다.mode가 1일 때 code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다.code[idx]가 "1"이면 mode를 1에서 0으로 바꿉니다.문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.

def solution(code):
    mode = False
    ret = ''
    
    for i in range(len(code)):
        if mode == False:
            if code[i]!="1" and i%2==0:
                ret += code[i]
            mode = not mode if code[i] == "1" else mode
        else:
            if code[i]!="1" and i%2==1:
                ret += code[i]
            mode = not mode if code[i] == "1" else mode
    if ret == '':
        ret = "EMPTY"
            
    return ret

아직은 요령이 없어서 문제 설명 곧이 곧대로 해석해서 코드를 짜는 것 같다.

 

1. if문으로 mode > 0,1 구분

2. 0일 때, code[i]가 1이 아니고, 짝수일 때 문자 추가 + code[i]가 1이면 토글

3. 1일 때, code[i]가 1이 아니고, 홀수일 때 문자 추가 + code[i]가 1이면 토글

4. 만들어진 문자열 ret이 빈 문자열이면 EMPTY 반환

def solution(code):
    answer = ''

    mode = 0
    for i in range(len(code)):
        if code[i] == '1':
            mode ^= 1
        else:
            if i % 2 == mode:
                answer += code[i]

    return answer if answer else 'EMPTY'

다른 사람 풀이 : 

1. code 문자열에서 "1"을 만날 때마다 mode를 토글하는 코드 :  mode ^= 1

(문자열이 1이면 추가 안하고 토글만)

2. if i % 2 == mode: > (mode == 0 and i % 2 ==0) or (mode == 1 and i % 2 ==1) 로 해석할 수 있음

> 그래서 mode 0이고 짝수이거나, mode 1이고 홀수일 때, 문자열 추가!

3. 만약 answer가 비어 있다면 "EMPTY"를 반환 

 


등차수열의 특정한 항만 더하기

문제 설명

두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다. 첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때, 이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요.

 

def solution(a, d, included):
    res = 0
    for i in range(len(included)):
        res += (a + i*d) if included[i] == True else 0
        
    return res

다행히?도 등차수열 합공식이 기억이 나서 활용했다.

불린 배열이 True일 때의 항만 더하기


주사위 게임 2

문제 설명

1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
def solution(a, b, c):
    answer = 0
    if a != b and b != c and a != c:
        answer = a + b + c 
    elif a == b == c:
        answer = (a + b + c) * (a**2 + b**2 + c**2) * (a**3 + b**3 + c**3)
    else: answer = (a + b + c) * (a**2 + b**2 + c**2)
        
    return answer

야호

def solution(a, b, c):
    check=len(set([a,b,c]))
    if check==1:
        return 3*a*3*(a**2)*3*(a**3)
    elif check==2:
        return (a+b+c)*(a**2+b**2+c**2)
    else:
        return (a+b+c)

다른 사람 풀이 :

set 클래스는 중복되지 않는 원소들로 구성된 집합(Set)을 나타냄

 

set 클래스를 처음 알았고 요렇게도 활용할 수 있구나

set([a, b, c)] : 주어진 리스트로부터 집합을 생성 > 집합은 중복된 원소를 허용하지 않고, 따라서 중복 값은 하나로 축소됨.

a,b,c 값을 비교하여 생성된 집합의 길이가

1이면 3개의 수가 다 같은 것, 2면 어느 2개의 수가 같은 것, 3이면 3개의 수가 모두 다름.

요렇게 활용해서 값을 추출한다. 


원소들의 곱과 합

문제 설명

문제 설명
정수가 담긴 리스트 num_list가 주어질 때, 모든 원소들의 곱이 모든 원소들의 합의 제곱보다 작으면 1을 크면 0을 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list):
    sum = 0
    cal = 1
    for i in range(len(num_list)):
        sum += num_list[i]
        cal *= num_list[i]
    sum = sum ** 2

    return 1 if cal < sum else 0

 

def solution(num_list):
    s = sum(num_list) ** 2
    m = eval('*'.join([str(n) for n in num_list]))
    return 1 if s > m else 0

다른 사람 풀이:

python 내장함수들을 잘 활용하는 것 같다.

sum 함수로 리스트의 모든 요소를 더하고 제곱함.

eval 함수 : 문자열로 표현된 파이썬 식(expression)을 실행하고 결과를 반환

리스트의 각 요소를 문자열로 변환한 리스트 생성 > 각 요소를 * 로 연결 > eval 함수로 수식 실행


이어 붙인 수

문제 설명

정수가 담긴 리스트 num_list가 주어집니다. num_list의 홀수만 순서대로 이어 붙인 수와 짝수만 순서대로 이어 붙인 수의 합을 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list):
    even = ""
    odd = ""

    for i in num_list:
        if i % 2 == 0:
            even += str(i)
        else:
            odd += str(i)
    return int(even) + int(odd)

if문으로 홀, 짝 구분 후 문자열 이어붙이기

마지막 return 할때 int로 더해서 출력

 

끝 아 졸려


 

Day4

  • n의 배수
  • 공배수
  • 홀짝에 따라 다른 값 반환하기
  • 조건 문자열
  • flag에 따라 다른 값 반환하기

n의 배수

문제 설명

정수 num과 n이 매개 변수로 주어질 때, num이 n의 배수이면 1을 return n의 배수가 아니라면 0을 return하도록 solution 함수를 완성해주세요.

 

def solution(num, n):
    return 1 if num % n == 0 else 0

나이쓰

def solution(num, n):
    return int(num % n == 0)

다른 사람 풀이 : true => 1, false => 0 을 활용해서 이렇게 풀 수도 있군


공배수

문제 설명

정수 number와 n, m이 주어집니다. number가 n의 배수이면서 m의 배수이면 1을 아니라면 0을 return하도록 solution 함수를 완성해주세요.

 

def solution(num, n, m):
    return 1 if num % n == 0 and num % m == 0 else 0
def solution(number, n, m):
    return int(bool(number % n == 0) & bool(number % m == 0))

다른 사람 풀이 :

bool - true/false >> int - 1,0 출력

oh... damn~~~~


홀짝에 따라 다른 값 반환하기

문제 설명

양의 정수 n이 매개변수로 주어질 때, n이 홀수라면 n 이하의 홀수인 모든 양의 정수의 합을 return 하고 n이 짝수라면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 return 하는 solution 함수를 작성해 주세요.
def solution(n):
    res = 0  
    if n%2==1:
        for i in range (1, n+1, 2):
            res += i
    else:
        for i in range(2, n+1, 2):
            res += i*i
    return res

정답이지만 제 코드는 상당히 기네요. 뭔가 짧고 신박한 다른 사람 풀이 보면 킹받음 

def solution(n):
    if n%2:
        return sum(range(1,n+1,2))
    return sum([i*i for i in range(2,n+1,2)]

다른 사람 풀이 : 

[i*i for in range(2, n+1, 2)] > 리스트 컴프리헨션 표현식 


조건 문자열

문제 설명

문자열에 따라 다음과 같이 두 수의 크기를 비교하려고 합니다.두 수가 n과 m이라면">", "=" : n >= m"<", "=" : n <= m">", "!" : n > m"<", "!" : n < m두 문자열 ineq와 eq가 주어집니다. ineq는 "<"와 ">"중 하나고, eq는 "="와 "!"중 하나입니다. 그리고 두 정수 n과 m이 주어질 때, n과 m이 ineq와 eq의 조건에 맞으면 1을 아니면 0을 return하도록 solution 함수를 완성해주세요.
def solution(ineq, eq, n, m):
    res = 0
    if eq == "=":
        cal = ineq + eq
        if cal == ">=":
            res = int(bool(n >= m))
        elif cal =="<=":
            res = int(bool(n <= m))

    else:
        cal = ineq
        if cal == ">":
            res = int(bool(n > m))
        elif cal =="<":
            res = int(bool(n < m))
    return res

제 코드ㅡㅡ 너무우 길어요

def solution(ineq, eq, n, m):
    return int(eval(str(n)+ineq+eq.replace('!', '')+str(m)))

다른 사람 풀이 :

1. 느낌표를 공백으로 대체 

2. n과 m을 문자열로 변환하여 ineq와 eq 문자열과 함께 문자열을 생성 

3. eval함수로 문자열을 평가하여 비교식 실행 

4. 정수로 변환하여 최종 결과 반환 ( True는 1로, False는 0으로)

eval
문자열을 파이썬 코드로 해석하고 실행함.
단일 표현식을 평가하는 데 사용되며, 표현식은 변수, 연산자, 함수 호출 등이 포함될 수 있다.


replace('!', ' ') 

특정 부분 문자열을 다른 문자열로 대체하는 데 사용됩니다.
replace('!', ' ')는 문자열에서 모든 느낌표(!)를 공백으로 대체하는 것을 의미

 


flag에 따라 다른 값 반환하기

문제 설명

두 정수 a, b와 boolean 변수 flag가 매개변수로 주어질 때, flag가 true면 a + b를 false면 a - b를 return 하는 solution 함수를 작성해 주세요.

 

def solution(a, b, flag):
    return a + b if flag else a - b

 

야호 오늘도 해냈다

하루에 5문제씩 매일 풀고 기록하기

새해니까 꾸준히 해보도록 해야지 작심삼일 제발 노노 ~~

문제가 어려운 건 아닌데 헷갈리고 바로 바로 해결방법이 생각나지 않는다 ..

그래도 꾸준히하면 늘겠지? 알고리즘 실력은 진짜 응애인 것 같다. 응애~


Day3 연산

  • 문자열 섞기
  • 문자 리스트를 문자열로 변환하기
  • 문자열 곱하기
  • 더 크게 합치기
  • 두 수의 연산값 비교하기

문자열 섞기

문제 설명

길이가 같은 두 문자열 str1과 str2가 주어집니다.
두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 한 번씩 등장하는 문자열을 만들어 return 하는 solution 함수를 완성해 주세요.

 

def solution(str1, str2):
    answer = ''
    
    for i in range(len(str1)):
        answer += (str1[i] + str2[i])
    
    return answer

 

반복문으로 인덱스를 활용해 문자를 하나씩 가져오고 더하기 연산자로 answer 변수에 반복해서 담는다.

이 문제는 다행히?도 내가 푼 방식으로 사람들이 많이 풀었다.


문자 리스트를 문자열로 변환하기

문제 설명

문자들이 담겨있는 배열 arr가 주어집니다. arr의 원소들을 순서대로 이어 붙인 문자열을 return 하는 solution함수를 작성해 주세요.
def solution(arr):
    answer = ''.join(arr)
    
    return answer

join 함수를 이용해서 너무 쉽게 풀 수 있었던 .. 더 짧게 쓰는 사람들은

def solution(arr):
    return ''.join(arr)

이렇게 풀어버린 .. ㄴㅇㄱ


문자열 곱하기

문제 설명

문자열 my_string과 정수 k가 주어질 때, my_string을 k번 반복한 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string, k):
    answer = ''
    
    for i in range(k):
        answer += my_string
    
    return answer

내가 푼 풀이

def solution(my_string, k):
    return my_string*k

 

단순하게 생각하면 편하네요


더 크게 합치기

문제 설명

연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.12 ⊕ 3 = 1233 ⊕ 12 = 312양의 정수 a와 b가 주어졌을 때, a ⊕ b와 b ⊕ a 중 더 큰 값을 return 하는 solution 함수를 완성해 주세요.단, a ⊕ b와 b ⊕ a가 같다면 a ⊕ b를 return 합니다.
def solution(a, b):
    answer = '' 
    ab = str(a)+str(b)
    ba = str(b)+str(a)

    if (ab > ba or ab==ba):
        answer = ab
    else:
        answer = ba

    return int(answer)

저는 이렇게 길게 짰는데요 ...

def solution(a, b):
	return int(max(f"{a}{b}", f"{b}{a}"))

포맷팅, max함수 이용해서 한 줄로 ..


두 수의 연산값 비교하기

문제 설명

연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.12 ⊕ 3 = 1233 ⊕ 12 = 312양의 정수 a와 b가 주어졌을 때, a ⊕ b와 2 * a * b 중 더 큰 값을 return하는 solution 함수를 완성해 주세요.단, a ⊕ b와 2 * a * b가 같으면 a ⊕ b를 return 합니다.
def solution(a, b):
    return max(int(str(a)+str(b)), 2*a*b)

방금 문제를 응용해서 풀어서 쉽게 성공

+ Recent posts