ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2025 프로그래머스 코드챌린지 2차 예선: 택배 상자 꺼내기
    코딩 테스트/Level 1 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
    반응형
Designed by Tistory.