[Pro] 2022/07/10 4문제

천호영·2022년 7월 10일
0

알고리즘

목록 보기
29/100
post-thumbnail

1. 음양 더하기

https://school.programmers.co.kr/learn/courses/30/lessons/76501?language=python3

def solution(absolutes, signs):
    for i, sign in enumerate(signs):
        if not sign:
            absolutes[i] *= (-1)
        
    return sum(absolutes)

보다 파이썬답게 풀려면 다음과 같이 할 수 있다.

def solution(absolutes, signs):
    return sum(abs_num if sign else -abs_num for abs_num, sign in zip(absolutes, signs))

2. 소수 만들기

https://school.programmers.co.kr/learn/courses/30/lessons/12977?language=python3

from itertools import combinations
import math

def is_prime(n):
    for i in range(2, int(math.sqrt(n))+1):
        if n%i==0:
            return False
    return True

def solution(nums):
    answer = 0
    for three_nums in combinations(nums,3):
        if is_prime(sum(three_nums)):
            answer += 1

    return answer

위에서 math.sqrt(n)은 n**0.5로 적을 수 있다.
소수를 구하는 가장 빠른 방법은 (N)\sqrt(N)까지 나눠 떨어지는 수를 체크하는거다.

3. 키패드

https://school.programmers.co.kr/learn/courses/30/lessons/67256?language=python3

def distance_cal(x_y_1, x_y_2):
    x1, y1 = x_y_1
    x2, y2 = x_y_2
    return abs(x1-x2) + abs(y1-y2)
    

def middle_num(L_coord, R_coord, number_coord, hand):
    L_distance = distance_cal(L_coord, number_coord)
    R_distance = distance_cal(R_coord, number_coord)
    if L_distance < R_distance:
        return "L"
    elif L_distance > R_distance:
        return "R"
    else:
        return "R" if hand == "right" else "L"

    
# 좌표 위치 저장
def init_coords():
    coords = [(0,0)]*10 # 0~9
    coords[0]=(3,1)
    for i in range(3):
        for j in range(3):
            coords[3*i+j+1] = (i,j)
    return coords


def solution(numbers, hand):
    answer = ''
    coords = init_coords()
    L_coord = (3,0)
    R_coord = (3,2)
    
    for number in numbers:
        if coords[number][1]==0:
            now_dir = "L"
        elif coords[number][1]==2:
            now_dir = "R"
        else:
            now_dir = middle_num(L_coord, R_coord, coords[number], hand)
            
        answer += now_dir
        if now_dir == "L":
            L_coord = coords[number]
        else:
            R_coord = coords[number]
            
    
    return answer

coordinate대신 postion이라 하는게 변수명이 깔끔한거같다.(현재위치는 cur_pos으로)
distance는 dist까지만 작성해도 의미전달이 될 듯.

4. 체육복

https://school.programmers.co.kr/learn/courses/30/lessons/42862?language=python3

def solution(n, lost, reserve):
    lost_uniq = set(lost)-set(reserve)
    reserve_uniq = set(reserve) - set(lost)
    
    answer = n - len(lost_uniq) # 없는 사람 제외하면
    for lost_per in lost_uniq:
        if lost_per-1 in reserve_uniq:
            answer += 1
            reserve_uniq -= {lost_per-1}
        elif lost_per+1 in reserve_uniq:
            answer += 1
            reserve_uniq -= {lost_per+1}
    return answer

첫번째 라인에서 다음과 같이 적고 삽질을 했다. 변수가 갱신되는 점에 주의하자.

lost = set(lost)-set(reserve) # 여기서 lost가 갱신됨
reserve = set(reserve) - set(lost)

나는 체육복이 없는 사람을 기준으로 for문을 돌았는데 여유분이 있는 사람을 기준으로 for문을 돌려도 된다. 이렇게 되면 answer 변수를 안써도 된다.

def solution(n, lost, reserve):
    lost_uniq = set(lost)-set(reserve)
    reserve_uniq = set(reserve) - set(lost)
    
    for reserve_per in reserve_uniq:
        if reserve_per-1 in lost_uniq:
            lost_uniq -= {reserve_per-1}
        elif reserve_per+1 in lost_uniq:
            lost_uniq -= {reserve_per+1}
            
    return n - len(lost_uniq)
profile
성장!

0개의 댓글