코딩 테스트/Level 1

2025 프로그래머스 코드챌린지 2차 예선: 택배 상자 꺼내기

컴닥 2025. 4. 6. 18:07
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/389478

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

def solution(n, w, num):
    answer = 0
    cargo = []
    point_x = point_y = None
    
    # 택배상자 쌓기
    for i in range(n // w + 1):
        if i % 2:
            start, end, step = (i + 1) * w - 1, i * w - 1, -1
        else:
            start, end, step = i * w, (i + 1) * w, 1
        cargo.append(tuple(j + 1 if j < n else 0 for j in range(start, end, step)))
    
    # num 택배 상자 위치 찾기 
    for y, row in enumerate(cargo):
        for x, each in enumerate(row):
            if each == num:
                point_x, point_y = x, y
    
    # num 상자 위 박스 체크 
    for y in range(len(cargo) - 1, point_y - 1, -1):
        if cargo[y][point_x] != 0:
            answer += 1
    return answer

for 문을 줄이는 것은 효율성을 많이 올려준다. 
cargo에 숫자를 채우면서 num의 좌표를 찾는다면 for 문을 하나 줄일 수 있다!

def solution(n, w, num):
    answer = 0
    cargo = []
    point_x = point_y = None
    for y in range(n // w + 1):
        if y % 2:
            start, end, step = (y + 1) * w - 1, y * w - 1, -1
        else:
            start, end, step = y * w, (y + 1) * w, 1
        row = []
        for x, each in enumerate(range(start, end, step)):
            row.append(each + 1 if each < n else 0)
            if each + 1 == num:
                point_x, point_y = x, y
        cargo.append(row)
    for y in range(len(cargo) - 1, point_y - 1, -1):
        if cargo[y][point_x] != 0:
            answer += 1
    return answer

실제로 시간이 약간 절약됨을 확인할 수 있다. 

사실 파이썬은 반복문 보다 리스트 컴프리헨션으로 구현했을 때 속도가 더 빠를 수 있기 때문에... (파이썬의 신비) 
실제로 테스트 해 보는 것이 좋다. 

하지만 이런 문제는 수학적으로 푸는 게 가장 좋긴 하다. 
나눗셈의 몫과 나머지를 이용해 좌표(coordinate)를 구할 수 있다. 

def solution(n, w, num):
    def find_coordinate(number):
        number -= 1
        y = number // w
        if y % 2 == 0:
            x = number % w
        else:
            x = w - number % w - 1
        return x, y

    num_x, num_y = find_coordinate(num)
    n_x, n_y = find_coordinate(n)

    last_line = 0
    if n_y % 2 == 0:
        if n_y > num_y and num_x > n_x:
            last_line = -1
    else:
        if n_y > num_y and num_x < n_x:
            last_line = -1
    return (n_y - num_y + 1) + last_line
반응형