문제

 

내가 작성한 코드 (틀림)
# 구명보트는 작아서 한 번에 최대 2명밖에 탈 수 없음
# 무게 제한도 존재
# 구명 보트를 최대한 적게 사용하여 모든 사람을 구출하려고 한다.
# 사람들의 몸무게를 담을 배열 people / 구명보트의 무게 제한 limit 매개변수
from collections import deque


def solution(people, limit):
    people.sort()
    people = deque(people)
    cnt = 0
    weight = 0
    
    if len(people) == 1:
        return 1
    
    else:
        while list(people):
            max_v = people.pop()

            if limit - max_v < people[0]:
                cnt += 1
            else:
                if len(people) >= 2:                    
                    weight += max_v
                    min_v = people.popleft()
                    weight += min_v
                else:
                    cnt += 1
                    break
        return cnt

> 아... 이번건 맞출 수 있을거 같았는데.... 어디가 문제지...ㅜㅜ

 

참고 코드
from collections import deque

def solution(people, limit):
    boat = 0
    people.sort()

    # 보트는 2명씩만 탈 수 있고 무게 제한도 있음.
    q = deque(people)
    w = 0
    cnt = 0
    while q:
        if len(q) >= 2:
            if q[0] + q[-1] <= limit:
                q.pop()
                q.popleft()
                boat += 1
            elif q[0] + q[-1] > limit:
                q.pop()
                boat += 1
        else:
            if q[0] <= limit:
                q.pop()
                boat += 1
    return boat

> 아.... 유사했는데... 쓰읍.... 다음에는 좀 더 잘해보자!!!

문제

 

내가 작성한 코드 (틀림)
import heapq

def solution(s):
    result_l = []
    for i in range(1, len(s) + 1):
        result = ''
        cnt = 0
        for j in range(len(s)):
            if s[j: j+i] == s[j+i: j+ (2*i)]:
                cnt += 1
            else:
                result += (str(cnt) + s[j: j+i]).replace('0', '')
                cnt = 0
        result_l.append(len(result))
        
    return min(result_l)

> 굉장히 어렵구만....

>  코드 실행에서 2개, 제출 후 체점하기에서는 16 / 100 의 점수가 나왔다... ㅜㅜ

 

참고 코드
def solution(s):
    answer = 10000
    if len(s) == 1:
        return 1
    for n in range(1, (len(s)//2) + 1):
        res = ''
        cnt = 1
        tmp = s[: n] # 단위문자열 초기화
        
        for i in range(n, len(s)+n, n):
            if tmp == s[i: i+ n]:
                cnt += 1
            else:
                if cnt == 1:
                    res += tmp
                else:
                    res += str(cnt) + tmp
                tmp = s[i : i + n]
                cnt = 1
        answer = min(answer, len(res))
    return answer

> https://eunhee-programming.tistory.com/135

 

코딩테스트 준비 - 프로그래머스: 문자열 압축 풀이+상세 (파이썬)

프로그래머스: 문자열 압출 풀이 문제 풀러 가기 https://programmers.co.kr/learn/courses/30/lessons/60057?language=python3 코딩테스트 연습 - 문자열 압축 데이터 처리 전문가가 되고 싶은 "어피치"는 문자열..

eunhee-programming.tistory.com

> 좀 더 논리적으로 생각해보자!! 

> 할수 있다!!!

문제

 

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

def solution(clothes):
    cloth_l = [i[1] for i in clothes]
    cloth = deque(set(cloth_l))
    cnt = 0
    
    while True:
        a = cloth.popleft()
        a_cnt = len([i[0] for i in clothes if i[1] == a])
        if not cloth:
            return len(cloth_l) + cnt
        else:
            v = 1
            for i in cloth:
                cloth_v = len([c[0] for c in clothes if c[1] == i] )
                v *= (cloth_v * a_cnt)
                cnt += v

> 코드 실행은 통과했지만, 제출 후 채점하기에서는 8문제만 맞춰서 28.6 / 100.0 점의 결과가 나왔습니다...

> 맞게 한거 같은데... ㅜㅜ

 

참고한 블로그
def solution(clothes):
    closet = {}
    answer = 1
    
    # 같은 종류의 옷끼리 묶어서 사전에 저장
    for cloth in clothes:
        if cloth[1] in closet.keys():
            closet[cloth[1]].append(cloth[0])
        else:
            closet[cloth[1]] = [cloth[0]]
    
    # 경우의 수 구하기            
    for value in closet.values():
        answer *= len(value) + 1
    
    # 아무것도 입지 않은 경우 하나 제외
    return answer-1

> 참고한 블로그

https://latte-is-horse.tistory.com/140

 

[프로그래머스 lv2] 위장 (파이썬)

문제 설명 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. 예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은

latte-is-horse.tistory.com

> 종류별 옷의 수에서 +1을 하는 의미는 옷을 입지 않은 경우를 포함하는 것!! 왜 이 생각을 못했지... ㅜㅜ

 

from collections import Counter
from functools import reduce

def solution(clothes):
    # 1. 의상 종류별 Counter를 만든다.
    counter = Counter([type for clothe, type in clothes])

    # 2. 모든 종류의 count + 1을 누적하여 곱해준다
    answer = reduce(lambda acc, cur: acc*(cur+1), counter.values(), 1) - 1
    return answer

print(solution([["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]))
출처: https://coding-grandpa.tistory.com/88 [개발자로 취직하기:티스토리]

> https://coding-grandpa.tistory.com/88

 

[프로그래머스] 위장 (해시 Lv. 2) - 파이썬 Python

0. 동일 유형 문제 [프로그래머스] 완주하지 못한 선수 (해시 Lv. 1) [프로그래머스] 전화번호 목록 (해시 Lv. 2) [프로그래머스] 위장 (해시 Lv. 2) [프로그래머스] 베스트 앨범 (해시 Lv. 3)   1. 문제

coding-grandpa.tistory.com

> 업그레이드 버전....

> reduce 함수는 여러 개의 데이터를 대상으로 누적 집계를 내기 위해 사용하는 함수이다. 굉장히 어렵다..

> 참고 블로그 (https://www.daleseo.com/python-functools-reduce/)

 

문제

 

내가 작성한 코드 (틀림)
# T 개의 테스트 데이터
t = int(input())

# H(행), W(열), guest(손님) 입력
for i in range(t):
    floor = 0
    room = 0
    h, w, guest = map(int, input().split())
    
    if guest % h == 0:
        floor = 100 *h
    else:
        floor = 100 * (guest%h)
        
    room = (guest // h) + 1
    print(floor + room)

> 틀리지 않은거 같은데 계속 오류가....

 

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

for i in range(t):
    h, w, n = map(int, input().split())
    num = n//h + 1
    floor = n % h
    if n % h == 0:  # h의 배수이면,
        num = n//h
        floor = h
    print(f'{floor*100+num}')

> 아....  n%h == 0 일때 num 변수도 수정을 해줬어야 했다... 아 좀 더 생각을 했어야 했는데...

> 참고한 블로그

https://ooyoung.tistory.com/88

 

백준 10250 [파이썬 알고리즘] ACM 호텔

[Python] 백준 알고리즘 온라인 저지 10250번 : ACM 호텔 Python3 코드 t = int(input()) for i in range(t): h, w, n = map(int, input().split()) num = n//h + 1 floor = n % h if n % h == 0: # h의 배수..

ooyoung.tistory.com

 

문제

 

내가 작성한 코드
# A(낮), B(밤), V(최종)
a, b, v = map(int, input().split())

if v <= a:
    print(1)
else:
    if (v-a)%(a-b) != 0:
        print( ((v-a)//(a-b)) + 2)
    else:
        print( ((v-a)//(a-b)) + 1)

> 풀 수 있을거 같은 문제였는데, 정말 안풀렸던 문제다...

> 처음부터 논리적으로 생각하면서 풀었으면 잘나왔을거 같은데, 급하게 풀라고해서 계속 막혔던거 같다.

 

코드 설명
# A(낮), B(밤), V(최종)
a, b, v = map(int, input().split())

> a는 낮에 올라갈 수 있는 길이, b는 밤에 내려오는 길이, v는 올라가야 할 최종 길이를 의미하는 각각의 변수입니다.

> 한 줄에 빈칸으로 입력되므로 map(int, input().split()) 함수를 사용했습니다.

 

if v <= a:
    print(1)
else:
    if (v-a)%(a-b) != 0:
        print( ((v-a)//(a-b)) + 2)
    else:
        print( ((v-a)//(a-b)) + 1)

> 먼저 v(최종 길이)가 a(낮에 올라갈 수 있는 길이)보다 같거나 작다면 하루만에 올라갈 수 있는 길이이므로 조건에 부합하면 print(1)을 출력하게했습니다.

> 이 코드에서 엄청 시간을 잡아먹었습니다. 일단 먼저 제일 많이 올라갈 수 있는 날은 하루 지나고 그 다음날 낮일 때 올라갈 수 있는길이가 가장 긴 시점입니다.

> 가장 높게  올라갈 수 있는 길이 = (a - b) + a  

> 그러므로 (v -  a)에 (a - b)로 나눠주면 최소 일자를 구할 수 있습니다. 

> 만약 (v - a) % (a- b) == 0 이라면 +1 을 해주어서 다음 날 a 만큼 올라간 것도 포함을 시켜주었습니다.

> 만약 (v - a) % (a - b) != 0 이라면 몫이 0이어서 하루만에 갈 수 있는 경우이거나, 최소 일자 + a 보다 더 올라가야 할 경우라고 볼 수 있습니다. 그러므로 , ((v- a) // (a-b)) + 2를 해주면 원하는 결과를 추출할 수 있습니다.

문제

 

참고한 코드
# X 입력받기
x = int(input())

# 짝수번째라인은 분자가 오름차순/분모가 내림차순
# 홀수번째라인은 분자가 내림차순/분모가 오름차순
line = 1

while x > line:
    x -= line
    line += 1
    
if line%2 == 0:
    a = x
    b = line-x+1
else:
    a = line-x+1
    b = x
print(a, '/', b, sep='')

> 후... 문제를 제대로 이해하는데도 시간이 걸렸다... 나는 왜 이해력이 딸리는  것인가... 

> 참고한 블로그

https://deokkk9.tistory.com/11

 

[python 파이썬] 백준 1193번: 분수찾기

https://www.acmicpc.net/problem/1193 1193번: 분수찾기 첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다. www.acmicpc.net X=int(input()) line=1 while X>line: X-=line line+=1 if line%2==0: a=X b=line-X+1..

deokkk9.tistory.com

 

코드 설명
x = int(input())

> X번째 분수를 추출하기 위한 값을 입력받는다.

 

line = 1

while x > line:
    x -= line
    line += 1

> 지그재그 순서의 첫 번째는 1/1이다. 표를 대각선으로 보게되면 분모가 1일때 하나, 2일때 2개, 3일 때 3개 이런식으로 보게 될 수 있습니다. 그 대각선 라인이 1씩 증가할때마다 그 값이 1씩 증가함을 보실수 있습니다.

> 그래서 line이라는 변수를 1로 설정했습니다.

> while문(반복문)을 사용하여 몇 번째 대각선인지 파악하기 위해서 line 을 빼주면서, 동시에 line은 1을 증가시켰습니다.

 

if line%2 == 0:
    a = x
    b = line-x+1
else:
    a = line-x+1
    b = x

> 표를 보게되면 대각선이 짝수 일때는 분자가 오름차순/분모가 내림차순이고, 홀수일때는, 분자가 내림차순/분모가 오름차순임을 알 수 있습니다.

> 그래서 line%2 ==0이면 짝수이므로, a(분자) 변수에는 x를 그대로, b(분모) 변수에는 대각선에 있는 분자 수(line)에 x를 빼주고 1을 추가로 더해주면서 알맞는 값을 추출하게 작성했습니다.

> 홀수는 짝수 반대로 a,b를 적용시켜주면 끝!!!

> 참.... 혼자할때는 보이지도 않은 길이... 어떻게 발견하시는지.....

> 나는야 코딩 길치 ㅜㅜ

문제

 

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

nums_pileup = 1  # 벌집의 개수, 1개부터 시작
cnt = 1
while n > nums_pileup :
    nums_pileup += 6 * cnt  # 벌집이 6의 배수로 증가
    cnt += 1  # 반복문을 반복하는 횟수
print(cnt)

> 참고한 블로그

https://ooyoung.tistory.com/82

 

백준 2292번 [파이썬 알고리즘] 벌집

[Python] 백준 알고리즘 온라인 저지 2292번 : 벌집 Python3 코드 n = int(input()) nums_pileup = 1 # 벌집의 개수, 1개부터 시작 cnt = 1 while n > nums_pileup : nums_pileup += 6 * cnt # 벌집이 6의 배..

ooyoung.tistory.com

> 왜 나는 그 규칙이 안보이지.... ㅜㅜ 

> 좀 더 차근차근 디테일하게 천천히 살펴보자!!!

문제

 

내가 작성한 코드
# A(고정비용), B(가변비용), C(1대의 노트북 가격)
a, b, c = map(int, input().split())

if (c-b) > 0:
    print( (a // (c-b)) +1)
else:
    print(-1)

> 처음에 while문으로 했는데 '시간 초과'로 실패했다. 천천히 수학적으로 생각하면은 길이 보인다!!

 

코드 설명
a, b, c = map(int, input().split())

> a는 고정비용, b는 가변비용, c는 1대의 노트북 가격으로 한 줄에 빈칸을 간격으로 떨어져있으므로 map(int, input().split()) 함수를 사용했다.

 

if (c-b) > 0:
    print( (a // (c-b)) +1)
else:
    print(-1)

> 코드를 짜기 전에 1차 방정식으로 이 문제를 생각해 볼 수 있다.

> 고정비용 + (가변비용 * 노트북 판매 수) < 노트북 가격 * 노트북 판매 수

> 노트북 판매수를 x로 치환하면 -> 고정비용 + 가변비용x < 노트북가격x -> (노트북 가격 - 가변비용)x > 고정비용

> 추가로, 손익분기점이 존재하지 않으면 -1을 출력하라고 했기 때문에 if-else문을 적용했습니다.

> (c - b)는 (노트북 가격 - 가변 비용)인데 이 값이 0보다 작으면 손익분기점이 존재하지 않게된다.

> 그러므로 0보다 작으면 print(-1)을 출력하게 했다.

> (a // (c-b) ) + 1은 고정비용을 (노트북 가격- 가변비용)의 값으로 나누었을 때 몫에 1을 추가한 값이다.

> 1을 추가하지 않으면 손익분기점이 0일 때이므로 +1을 해주었습니다.

+ Recent posts