티스토리 뷰

728x90

 

[ 코딩 테스트 연습 ]

 
 
 
 
 
 

91. 개미 군단

  • 개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.
  • 제한사항 :
    • hp는 자연수입니다.
    • 0 ≤ hp ≤ 1000
  • 내가 푼 풀이
def solution(hp):
    X = hp // 5  # 장군개미로 먼저 많이 나눌 수 있을 만큼 나눈 몫
    Y = hp % 5  # 장군개미로 먼저 많이 나눈 후 나머지

    # 남은 체력에 따라 병정개미와 일개미를 추가로 사용
    # 4,3,2,1 이 나올 때
    if Y == 0:
        return X
    elif Y == 3:
        return X + 1
    elif Y == 1:
        return X + 1
    else:
        return X + 2

print(solution(999))
# 출력 : 201

 

 

  • 다른 사람의 풀이
def solution(hp):
    return hp // 5 + (hp % 5 // 3) + ((hp % 5) % 3)
def solution(hp):
    answer = 0
    for ant in [5, 3, 1]:
        d, hp = divmod(hp, ant)
        # divmod(num1,num2) # num1을 num2 로 나눈 몫과 나머지를 출력하는 함수
        answer += d
    return answer
def solution(hp):
    count = 0
    ants = [5, 3, 1]    

    for att in ants:
        count += hp // att
        hp %= att

    return count
def solution(hp):
    answer = 0
    answer += hp//5
    hp %= 5
    answer += hp//3
    hp %= 3
    answer += hp//1

    return answer

 

 

 

 

 

 

 

 

92. 특정한 문자를 대문자로 바꾸기 

  • 영소문자로 이루어진 문자열 my_string과 영소문자 1글자로 이루어진 문자열 alp가 매개변수로 주어질 때, my_string에서 alp에 해당하는 모든 글자를 대문자로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.
  • 제한사항 :
    • 1 ≤ my_string의 길이 ≤ 1,000
  • 내가 푼 풀이
def solution(my_string, alp):
    return my_string.replace(alp, alp.upper())

print(solution("programmers","p"))
# 출력 : Programmers
  • replace() 메서드는 문자열에서 특정 부분 문자열을 다른 부분 문자열로 대체하는 데 사용. 

 

  • 다른 사람의 풀이
def solution(my_string, alp):
    result = ""
    for c in my_string:
        if c == alp:
            result += c.upper()
        else:
            result += c
    return result
def solution(my_string, alp):
    return "".join([i.upper() if i == alp else i for i in my_string])

 

 

 

 

 

 

 

93. 문자열 바꿔서 찾기 

  • 문자 "A"와 "B"로 이루어진 문자열 myString pat가 주어집니다. myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.
  • 제한사항 :
    • 1 ≤ myString의 길이 ≤ 100
    • 1 ≤ pat의 길이 ≤ 10
      • myString과 pat는 문자 "A"와 "B"로만 이루어진 문자열입니다.
  • 내가 푼 풀이
def solution(myString, pat):
    New = myString.replace("A","B").replace("B","A")
    return New
  • replace를 연속해서 쓸 수 있으나 a->b로 바꾼다음에 다시 b->a 로 바꿔버리면 aaaa로만 인쇄된다. 따라서 a를 임의의 다른 알파벳으로 바꾸어주어야 한다. 아래처럼
def solution(myString, pat):
    New = myString.replace("A", "X").replace("B", "A").replace("X", "B")
    return 1 if pat in New else 0

print(solution("ABBAA","AABB"))
# 출력 : 1

 

  • 다른 사람의 풀이
def solution(myString, pat):
    return int(''.join(['A' if i == 'B' else 'B' for i in pat]) in myString)
def solution(myString, pat):
    pat=list(pat)
    for i in range(len(pat)):
        if pat[i]=='B':
            pat[i]='A'
        else: pat[i]='B'
    if ''.join(pat) in myString: return 1
    return 0
def solution(myString, pat):
    answer=''
    for m in myString:
        if m=='A':
            answer+='B'
        elif m=='B':
            answer+='A'
        else:
            answer+=m

    return int(pat in answer)

 

 

 

 

 

 

 

 

94. 5명씩 

  • 최대 5명씩 탑승가능한 놀이기구를 타기 위해 줄을 서있는 사람들의 이름이 담긴 문자열 리스트 names가 주어질 때, 앞에서 부터 5명씩 묶은 그룹의 가장 앞에 서있는 사람들의 이름을 담은 리스트를 return하도록 solution 함수를 완성해주세요. 마지막 그룹이 5명이 되지 않더라도 가장 앞에 있는 사람의 이름을 포함합니다.
  • 제한사항 :
    • 5 ≤ names의 길이 ≤ 30
    • 1 ≤ names의 원소의 길이 ≤ 10
    • names의 원소는 영어 알파벳 소문자로만 이루어져 있습니다.
  • 내가 푼 풀이
def solution(names):
    groups = []
    for i in range(0, len(names), 5): # i를 5개까지 추출
        group = names[i:i+5]          # 그룹에 넣는다
        groups.append(group[0])       # 그룹의 0번째 순번을 groups에 추가
    return groups

print(solution(["nami", "ahri", "jayce", "garen", "ivern", "vex", "jinx"]))
# 출력 : ['nami', 'vex']

 

 

  • 다른 사람의 풀이
def solution(names):
    return names[::5]
def solution(names):
    answer = []
    for i in range(len(names)):
        if i % 5 == 0:
            answer.append(names[i])
    return answer
def solution(names):
    return [names[i] for i in range(0,len(names),5)]
def solution(names):
    return names[0:len(names):5]

 

 

 

 

 

 

 

 

95. n개 간격의 원소들 

  • 정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 마지막 원소까지 n개 간격으로 저장되어있는 원소들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
  • 제한사항 :
    • 5 ≤ num_list의 길이 ≤ 20
    • 1 ≤ num_list의 원소 ≤ 9
    • 1 ≤ n ≤ 4
  • 내가 푼 풀이
def solution(num_list, n):
    return num_list[::n]  #[시작:끝:n간격]

print(solution([4, 2, 6, 1, 7, 6],2))
# 출력 : [4, 6, 7]

 

  • 다른 사람의 풀이
def solution(num_list, n):
    return num_list[0:len(num_list): n]
def solution(num_list, n):
    answer = []
    for i in range(0,len(num_list),n):
        answer.append(num_list[i])
    return answer
def solution(num_list, n):
    return [num_list[i] for i in range(0,len(num_list),n)]

 

 

 

 

 

 

 

 

96. 할 일 목록 

  • 오늘 해야 할 일이 담긴 문자열 배열 todo_list와 각각의 일을 지금 마쳤는지를 나타내는 boolean 배열 finished가 매개변수로 주어질 때, todo_list에서 아직 마치지 못한 일들을 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.
  • 제한사항 :
    • 1 ≤ todo_list의 길이 1 ≤ 100
    • 2 ≤ todo_list의 원소의 길이 ≤ 20
      • todo_list의 원소는 영소문자로만 이루어져 있습니다.
      • todo_list의 원소는 모두 서로 다릅니다.
    • finished[i]는 true 또는 false이고 true는 todo_list[i]를 마쳤음을, false는 아직 마치지 못했음을 나타냅니다.
    • 아직 마치지 못한 일이 적어도 하나 있습니다.
  • 내가 푼 풀이
def solution(todo_list, finished):
    NO = []
    for i in range(len(todo_list)):
        if not finished[i]:
            NO.append(todo_list[i])
    return NO

print(solution(["problemsolving", "practiceguitar", "swim", "studygraph"],[True, False, True, False]))
# 출력 : ['practiceguitar', 'studygraph']

 

  • 다른 사람의 풀이
def solution(todo_list, finished):
    return [work for idx, work in enumerate(todo_list) if not finished[idx]]
  • enumerate(todo_list): enumerate 함수는 순회 가능한 객체(여기서는 todo_list)를 받아 인덱스와 해당 요소로 이루어진 튜플을 반환합니다. 예를 들어, enumerate(['a', 'b', 'c'])는 (0, 'a'), (1, 'b'), (2, 'c')와 같이 인덱스와 해당 요소로 이루어진 튜플을 반환합니다.
def solution(todo_list, finished):
    return [x for x, b in zip(todo_list, finished) if not b]
  • zip(todo_list, finished): zip 함수를 사용하여 todo_listfinished 리스트를 병렬로 묶습니다. 이렇게 하면 각각의 작업과 해당 작업이 완료되었는지를 나타내는 부울 값이 한 쌍으로 묶입니다. 
  • todo_listfinished 리스트를 병렬로 순회하면서 작업이 아직 완료되지 않았다면 해당 작업의 이름을 새로운 리스트에 추가하는 방식으로 작동합니다.
def solution(todo_list, finished):
    answer = []
    for i in range(len(finished)):
        if finished[i]==False:
            answer.append(todo_list[i])
    return answer
def solution(todo_list, finished):
    return list(i[0] for i in zip(todo_list, finished) if not i[1])
    # todo_list = [1,2,3,4,5]
    # finished = [T, F, T, T, F]
    # (1, T) (2, F) (3, T) - zip 함수의 형태

 

 

 

 

 

 

 

97. 공백으로 구분하기 2 

  • 단어가 공백 한 개 이상으로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.
  • 제한사항 :
    • my_string은 영소문자와 공백으로만 이루어져 있습니다.
    • 1 ≤ my_string의 길이 ≤ 1,000
    • my_string의 맨 앞과 맨 뒤에도 공백이 있을 수 있습니다.
    • my_string에는 단어가 하나 이상 존재합니다.
  • 내가 푼 풀이 (81. 공백으로 구분하기 1  와 같이 쓸수 있음)
def solution(my_string):
    return my_string.split()

print(solution(" i    love  you"))
# 출력 : ['i', 'love', 'you']

 

 

  • 다른 사람의 풀이
solution=lambda x:x.split()
def solution(my_string):
    return [i for i in my_string.split(" ") if i != ""]

 

 

 

 

 

 

 

 

 

98. A 강조하기 

  • 문자열 myString이 주어집니다. myString에서 알파벳 "a"가 등장하면 전부 "A"로 변환하고, "A"가 아닌 모든 대문자 알파벳은 소문자 알파벳으로 변환하여 return 하는 solution 함수를 완성하세요.
  • 제한사항 :
    • 1 ≤ myString의 길이 ≤ 20
      • myString은 알파벳으로 이루어진 문자열입니다.
  • 내가 푼 풀이
def solution(my_string):
    A = my_string.lower()
    return A.replace("a","A")

print(solution("PrOgRaMmErS"))
# 출력 : progrAmmers

 

  • 다른 사람의 풀이
def solution(myString):
    return myString.lower().replace('a', 'A')
def solution(myString):
    answer = []
    for x in myString:
        if x in ('a','A'): answer.append('A')
        else: answer.append(x.lower())
    return ''.join(answer)

 

 

 

 

 

 

 

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

  • 길이가 같은 문자열 배열 my_strings와 이차원 정수 배열 parts가 매개변수로 주어집니다. parts[i]는 [s, e] 형태로, my_string[i]의 인덱스 s부터 인덱스 e까지의 부분 문자열을 의미합니다. 각 my_strings의 원소의 parts에 해당하는 부분 문자열을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.
  • 제한사항 :
    • 1 ≤ my_strings의 길이 = parts의 길이 ≤ 100
    • 1 ≤ my_strings의 원소의 길이 ≤ 100
    • parts[i]를 [s, e]라 할 때, 다음을 만족합니다.
      • 0 ≤ s ≤ e < my_strings[i]의 길이
  • 내가 푼 풀이
def extract_substring(string, part):
    answer = ''
    for i in range(len(string)):
        answer += string[s:e+1]
        return answer
  • 나올 것 같은데 안나온다아아아ㅠㅠㅠㅠ 한꺼번에 하는 방법은 없을까... 각각의 단어들 부터 추출한 뒤에 합치자.
def I_solution(string, part):
    s, e = part
    return string[s:e+1]  # 먼저 각 함수들의 부분문자열을 추출

def solution(my_strings, parts):
    answer = ""
    for i in range(len(my_strings)):
        answer += I_solution(my_strings[i], parts[i])
    return answer

print(solution(["progressive", "hamburger", "hammer", "ahocorasick"],[[0, 4], [1, 2], [3, 5], [7, 7]]))
# 출력 : "programmers"

 

 

  • 다른 사람의 풀이
def solution(my_strings, parts):
    answer = ""
    for i, (s, e) in enumerate(parts):
        answer += my_strings[i][s:e+1]
    return answer
def solution(my_strings, parts):
    return ''.join([x[y[0]:y[1]+1] for x,y in zip(my_strings, parts)])
def solution(my_strings, parts):
    answer = ""
    for i in range(len(parts)):
        answer += (my_strings[i][parts[i][0]:parts[i][1] + 1])
    return answer
def solution(my_strings, parts):
    return ''.join(my_strings[i][parts[i][0]:parts[i][1]+1] for i in range(len(my_strings)))

 

 

 

 

 

 

 

 

 

100.  주사위 게임 1 

  • 1부터 6까지 숫자가 적힌 주사위가 두 개 있습니다. 두 주사위를 굴렸을 때 나온 숫자를 각각 a, b라고 했을 때 얻는 점수는 다음과 같습니다.
    • a와 b가 모두 홀수라면 a2 + b2 점을 얻습니다.
    • a와 b 중 하나만 홀수라면 2 × (a + b) 점을 얻습니다.
    • a와 b 모두 홀수가 아니라면 |a - b| 점을 얻습니다.
    두 정수 a와 b가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
  • 제한사항 :
    • a와 b는 1 이상 6 이하의 정수입니다.
  • 내가 푼 풀이
def solution(a, b):
    if a % 2 != 0 and b % 2 != 0:
        return a*a + b*b
    elif a % 2 != 0 or b % 2 != 0:
        return 2 * ( a + b )
    elif a % 2 == 0 and  b % 2 == 0:
        return abs( a - b ) # abs()는 절댓값 함수

print(solution(2,4))
# 출력 : 2

 

 

  • 다른 사람의 풀이
def solution(a, b):
    if a%2 and b%2: return a*a+b*b
    elif a%2 or b%2: return 2*(a+b)
    return abs(a-b)
def solution(a, b):
    if (a % 2 != 0) and (b % 2 != 0):
        return (a ** 2) + (b ** 2)
    elif (a % 2 != 0) or (b % 2 != 0):
        return 2 * (a + b)
    else:
        return abs(a - b)

 

 

 

 

 

반응형
반응형
TAG
more
최근에 올라온 글