문제

 

내가 작성한 코드 (틀림)
from collections import deque

def solution(phone_book):
    phone_book.sort()
    phone_book = deque(phone_book)
    
    while phone_book:
        book = phone_book.popleft()
        if len([i for i in phone_book if book == i[:len(book)]]) != 0:
            return False
    else:
        return True

> 효율성(3, 4)에서 계속 시간초과로 에러가 뜬다...

 

참고한 코드
def solution(phoneBook):
    phoneBook = sorted(phoneBook)

    for p1, p2 in zip(phoneBook, phoneBook[1:]):
        if p2.startswith(p1):
            return False
    return True

> 참고 블로그

https://velog.io/@chaegil15/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%95%B4%EC%8B%9C-%EC%A0%84%ED%99%94%EB%B2%88%ED%98%B8-%EB%AA%A9%EB%A1%9D

 

[프로그래머스/파이썬] (해시) 전화번호 목록

출처전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.구

velog.io

> 알아두어야 할 것

 1. startswith() 함수

  - 사용법 : str2.startswith(str1 or tuple) 형식

  - 반환값 : True / False

  - 의미 : str2가 str1으로 시작하면 True 를 아니면 False를 출력하는 함수이다.

 

 2. 문자열을 오름차순 할 때

  - 처음에 문자열을 오름차순하는 것을 숫자로 되어있다보니까 숫자 순으로 오름차순되는 것으로 오해해서 이해가 잘 안갔다.

  - 하지만, 문자순 오름차순하게 되면 예를 들어 ['12', '123', '568', '88'] 이것을 오름차순하게 되면, ['12', '123', '568', '88'] 이렇게 오름차순으로 정렬이 된다.

  - 그러므로 위에 코드가 zip() 함수로 묶어서 진행을 하게되면, 유사한 값끼리 비교를 하게되니까 정답을 추출할 수 있는 것이다.

문제

 

내가 작성한 코드
def solution(participant, completion):
    participant.sort()
    completion.sort()
    
    for i in range(len(completion)):
        if participant[i] != completion[i]:
            return participant[i]
    return participant[-1]

 

코드 설명
participant.sort()
completion.sort()

> participant.sort() : 참가자 명단을 오름차순으로 정렬하였습니다.

> completion.sort() : 완주자 명단을 오름차순으로 정렬하였습니다.

> 이름 순으로 정렬을 하면, participant 명단과 completion 명단에서 같은 index이지만 이름이 다른 두 명을 찾을 수 있기 때문입니다.

 

for i in range(len(completion)):
    if participant[i] != completion[i]:
        return participant[i]
return participant[-1]

> completion 길이 만큼 반복문을 진행하였습니다. completion 명단이 participant 길이보다 짧기 때문에 index error가 발생하지 않기 때문입니다.

> if 문을 사용하여 같은 index 이지만 이름이 다를 때 participant 명단에서 완주하지 못한 사람을 추출할 수 있습니다. 

> 마지막 participant[-1]은 완주하지 못한 사람이 participant 명단 맨 마지막에 있는 경우 반복문에서 찾지 못하기 때문에 따로 빼서 코드를 작성하였습니다.

 

참고할만한 코드
import collections

def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]

> Counter 함수를 알았지만, 이처럼 다른 Counter 함수를 적용한 것끼리 뺄 수 있음을 처음 알게 되었습니다.

> 마지막 answer.keys() 를 적용하면 dict로 적용된 key 값인 사람 이름을 추출할 수 있습니다.

> 나중에 사용할 수 있으면 사용해보자!!

문제

 

내가 작성한 코드
def solution(nums):
    choice_p = int(len(nums) / 2)
    index_p = list(set(nums))

    if choice_p >= len(index_p):
        return len(index_p)
    else:
        return choice_p

 

코드 설명
choice_p = int(len(nums) / 2)
index_p = list(set(nums))

> choice_p : nums 변수에 있는 포켓몬들 중 선택할 수 있는 포켓몬의 수

> index_p : nums 변수를 set() 함수를 사용하여 반복 값을 제거하고, list() 함수를 사용하여 리스트로 변경한 것입니다.

 

if choice_p >= len(index_p):
    return len(index_p)
else:
    return choice_p

> if-else 문을 사용하여 선택할 수 있는 포켓몬의 수가 유일한 포켓몬의 수보다 같거나 크면 유일한 포켓몬의 수를 출력하고, 아니면 선택할 수 있는 포켓몬의 수를 출력하였습니다.

 

참고할 코드
def solution(ls):
    return min(len(ls)/2, len(set(ls)))

> 와우!!!

> 진짜 미쳤닼ㅋㅋㅋ

문제

 

내가 작성한 코드(틀림)

> 도저히 모르겠다...

> 이거 그래프이론에서 본거 같은데 ㅜㅜ

 

참고 코드
import sys

N = int(input()) #도시의 개수
travel_cost = [list(map(int, input().split())) for _ in range(N)]
min_value = sys.maxsize #출력할 최소값 정의


def dfs_backtracking(start, next, value, visited): #시작도시번호,다음도시번호,비용,방문 도시
    global min_value

    if len(visited) == N: #만약 방문한 도시가 입력받은 도시의 개수라면
        if travel_cost[next][start] != 0: #마지막 도시에서 출발 도시로 가는 비용이 0이 아니라면(즉,갈수 있다면)
            min_value = min(min_value, value + travel_cost[next][start]) #더한 값을 저장되어있는 최소값과 비교해서 대입
        return min_value
    for i in range(N): #도시의 개수 만큼 반복문을 돈다.
        #만약 현재 도시에서 갈 수 있는 도시의 비용이 0이 아니고 이미 방문한 도시가 아니며 그 비용값이 저장되어있는 최소값보다 작다면
        if travel_cost[next][i] != 0 and i not in visited and value < min_value: 
            visited.append(i) #그 도시를 방문목록에 추가
            dfs_backtracking(start, i, value + travel_cost[next][i], visited) #그 도시를 방문한다.
            visited.pop() #방문을 완료했다면 방문목록 해제


#도시마다(0~3) 출발점을 지정
for i in range(N):
    dfs_backtracking(i, i, 0, [i])

print(min_value)

> 참고한 블로그

https://ji-gwang.tistory.com/266

 

백준 10971번 파이썬 문제풀이(브루트 포스 - 외판원 순회 2)

코드 import sys N = int(input()) #도시의 개수 travel_cost = [list(map(int, input().split())) for _ in range(N)] min_value = sys.maxsize #출력할 최소값 정의 def dfs_backtracking(start, next, value,..

ji-gwang.tistory.com

> DFS를 이용하셔서 풀었다. 다시 DFS를 공부하자!!!

문제

 

내가 작성한 코드
# 전체 사람의 수 N 입력
n = int(input())
w_h = []

# N명의 몸무게와 키 받기
for i in range(n):
    w_h.append(list(map(int, input().split())))
    
# N명의 덩치 등수 출력
for i in range(n):
    print(len([a for a in w_h if (a[0] > w_h[i][0]) and (a[1] > w_h[i][1])]) + 1, end= ' ')

 

코드 설명
# 전체 사람의 수 N 입력
n = int(input())
w_h = []

> 변수 n 은 전체 사람의 수를 입력받기 위한 변수입니다.

> w_h 변수는 전체 사람의 수 N명만큼의 키와 몸무게의 값을 담기 위한 빈 리스트입니다.

> 처음 코드를 작성할 때 n = int(input().split()) 으로 해서 계속 typeerror 가 발생했는데, 조금 천천히 작성하자!!

 

# N명의 몸무게와 키 받기
for i in range(n):
    w_h.append(list(map(int, input().split())))

> N명의 몸무게와 키를 받기 위해서 반복문을 사용했습니다.

> 한 명당 키와 몸무게가 한 줄로 빈칸을 두고 입력되기 때문에 input().split() 함수를 사용하였고, 몸무게와 키를 하나의 리스트로 묶어서 w_h 변수에 담기위해서 list(map(int, input().split())) 함수를 적용하였습니다.

 

# N명의 덩치 등수 출력
for i in range(n):
    print(len([a for a in w_h if (a[0] > w_h[i][0]) and (a[1] > w_h[i][1])]) + 1, end= ' ')

> N명의 덩치 등수를 출력하기 위해서 반복문을 다시 사용하였습니다.

> 입력된 순서대로 출력을 해야하기 때문에 반복문을 한 번 더 사용했습니다.

> 등수 출력을 위해서 list compression을 사용하였고, 자기 자신을 비교하더라도 덩치가 좋다의 조건은 자기의 키와 몸무게 모두 초과로 값이 나와야 하기 때문에 위의 코드로 작성하였습니다.

> 마지막으로 등수가 1부터 시작해야하므로, 1을 더해주었습니다.

문제

 

내가 작성한 코드
# A와 B 입력
a, b = map(int, input().split())
print(a + b)

> 오잉??

> 갑자기 난이도 급하락ㅋㅋㅋㅋㅋㅋ

> 이번에는 코드 설명안해도 되겠닼ㅋㅋㅋㅋ

 

문제

 

내가 작성한 코드 (틀림)
def make_sugar(n, sugar_l):
    cnt = 0
    while sugar_l:
        sugar = sugar_l.pop()
        if n // sugar == 0:
            continue
        else:
            if (n%sugar < 3):
                if (n // sugar) -1 == 0:
                    continue
                else:
                    n -= (sugar * ((n//sugar)-1))
                    if sugar == 8:
                        cnt += ((n // sugar) -1) * 2
                    else:
                        cnt += ((n // sugar) -1)
            if n%sugar == 0:
                cnt += n // sugar
                return(cnt)
            
    return -1
# 배달해야할 N킬로그램 설탕 입력
n = int(input())
sugar_l = [3, 5, 8]

print(make_sugar(n, sugar_l))

> 하... 이건 맞췄어야 됐는디... 왜 안풀리지...

 

참고한 코드
sugar = int(input())

bag = 0
while sugar >= 0 :
    if sugar % 5 == 0 :  # 5의 배수이면
        bag += (sugar // 5)  # 5로 나눈 몫을 구해야 정수가 됨
        print(bag)
        break
    sugar -= 3  
    bag += 1  # 5의 배수가 될 때까지 설탕-3, 봉지+1
else :
    print(-1)

> 참고한 블로그

https://ooyoung.tistory.com/81

 

백준 알고리즘 2839 [파이썬] : 설탕 배달

[Python] 백준 알고리즘 온라인 저지 2839번 : 설탕 배달 Python3 코드 sugar = int(input()) bag = 0 while sugar >= 0 : if sugar % 5 == 0 : # 5의 배수이면 bag += (sugar // 5) # 5로 나눈 몫을 구해야..

ooyoung.tistory.com

> 정말 대박... 어떻게 이렇게...

> 처음으로 while문 아래다가 else: 문을 적용해도 되는지 알았다!! 많이 배웠습니다!!

문제

 

내가 작성한 코드 (틀림)
# Test Case 수 T 입력
t = int(input())

# 0층 i호 사람 수 입력
def make_apart():
    aparts = [ [0] * 14 for i in range(14) ]
    for i in range(14):
        aparts[0][i] = i + 1 
    return aparts


# Test Case 수만큼 첫번째 줄에 층(k), 호수(n) 입력
for _ in range(t):
    k = int(input())
    n = int(input())
    aparts = make_apart()
    for i in range(1, k+1):
        for j in range(n):
            aparts[i][j] = sum( aparts[i-1][0:(j+1)])
    print(aparts[k][n-1])

> 분명히 맞는거 같은데... 머가 문제지..

 

참고 코드
t = int(input())

for _ in range(t):  
    floor = int(input())  # 층
    num = int(input())  # 호
    f0 = [x for x in range(1, num+1)]  # 0층 리스트
    for k in range(floor):  # 층 수 만큼 반복
        for i in range(1, num):  # 1 ~ n-1까지 (인덱스로 사용)
            f0[i] += f0[i-1]  # 층별 각 호실의 사람 수를 변경
    print(f0[-1])  # 가장 마지막 수 출력

> 참고 블로그

https://ooyoung.tistory.com/89

 

백준 2775번 [파이썬 알고리즘] 부녀회장이 될테야

[Python] 백준 알고리즘 온라인 저지 2775번 : 부녀회장이 될 테야 Python3 코드 t = int(input()) for _ in range(t): floor = int(input()) # 층 num = int(input()) # 호 f0 = [x for x in range(1, num+1)..

ooyoung.tistory.com

> 오호.... 나는 왜 이렇게 어렵게 생각할까.... 후....

 

+ Recent posts