Day13 리스트(배열)

  • n번째 원소부터
  • 순서 바꾸기
  • 왼쪽 오른
  • n번째 원소까지
  • n개 간격의 원소

n번째 원소부터

문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, n 번째 원소부터 마지막 원소까지의 모든 원소를 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list, n):    
    return num_list[n-1:]

3번째 원소면 2번째 인덱스부터 시작해야 하니 슬라이싱 n-1부터 끝까지


순서 바꾸기

문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, num_list를 n 번째 원소 이후의 원소들과 n 번째까지의 원소들로 나눠 n 번째 원소 이후의 원소들을 n 번째까지의 원소들 앞에 붙인 리스트를 return하도록 solution 함수를 완성해주세요.
def solution(num_list, n):
    return num_list[n:] + num_list[:n]

슬라이싱할 때 n번째 원소, 인덱스 헷갈림 주의


왼쪽 오른쪽

문제 설명

문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있습니다. str_list에서 "l"과 "r" 중 먼저 나오는 문자열이 "l"이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를, 먼저 나오는 문자열이 "r"이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요. "l"이나 "r"이 없다면 빈 리스트를 return합니다.

 

def solution(str_list):
    for i in range(len(str_list)):
        if str_list[i] == "l":
            return str_list[:i]
        elif str_list[i] == "r":
            return str_list[i+1:]

    return []

 

계속 65, 75점으로 실패하다가 코드 간단하게 수정했더니 이왜진 ...??

간단하게 생각해서

리스트에서 l이 있으면 그때의 인덱스 왼쪽 값 return

r이 있으면 그때 인덱스부터 오른쪽 값 return 

둘다 아니면 빈 배열 리턴 ㅎㅎ;

간단한 문제에서 시간 빼앗긴 기분이라 허무하다


n번째 원소까지

문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 n 번째 원소까지의 모든 원소를 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

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

n개 간격의 원소들

문제 설명

정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 마지막 원소까지 n개 간격으로 저장되어있는 원소들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

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

파이썬아 고마워 .. 날먹하면서도 이게 맞는건지 싶음. ㅋㅋㅋ

ㅋㅋㅋㅋ 그냥 웃겨서 ...


빨리 기초 끝내고 난이도 올리고 싶다 !!

쉽다고 갑자기 어려운 문제 풀어버리면 꾸준히 못할 것 같아서

느리지만~ 천천히 한단계씩 올라가는 중

세번째 문제에서 헷갈려서 계속 반례 ...

근데 생각보다 너무 간단한 답이어서 허무 ..

그래두 해냈어요 오늘두 야호

 

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 어쩌고 신청을 해놔서 사전 문제 풀려고 봤는데 진짜 도저히 모르겠더라고요 ..... 그래두 꾸준히 해보자 아자잣

+ Recent posts