1주차 4번(ACM호텔)

Hyo Kyun Lee·2021년 5월 23일
0

Python

목록 보기
22/26
post-thumbnail

1.문제 링크

https://www.acmicpc.net/problem/10250

2. 풀이 전 계획과 생각

  • 배정되는 방의 순서는 이미 정해져있다.
  • 손님에 따라 선택할 수 있는 방의 번호를 구현하는 로직을 생각해보기
  • 단순 반복문의 나열이 아닌, 최대한 클린코드와 가독성을 생각한 로직구현

2-1. 풀이를 위한 접근방식

N번째 손님이 왔을때 배정되는 방의 번호를 구하는 로직을 생각해보기

2-2. 풀이

Before Refactoring

import sys
T = int(sys.stdin.readline())

for i in range(T):
    H, W, N = map(int, sys.stdin.readline().split())

    steps = 1
    height = 1
    width = 1

    while steps < N:
        if height < H and width < W:
            height = height + 1
            steps = steps + 1
            continue

        elif height == H and width < W:
            height = 1
            width = width + 1
            steps = steps + 1
            continue

        elif height < H and width == W:
            height = height + 1
            width = 1
            steps = steps + 1
            continue

        # 코드의 논리적 오류를 최소화 하기위한 형식적 코드
        else:
            pass

    print(height * 100 + width)

After Refactoring

함수선언후 행별 숫자를 입력받아 함수호출 및 결과출력

# T Test case W 각 층별 방의 개수, H 건물높이(층수), N 몇번째 손님
# 걷는 거리가 작은 것이 우선순위, 걷는거리가 같을때엔 아래층의 방을 더 먼저
# 101 > 201 > 301 > 401 > ..... 순서대로 배정

import sys
T = int(sys.stdin.readline())


def get_room_number_for_Nth_customer(H, W, N):
    global height, width

    steps = 1
    height = 1
    width = 1

    while steps < N:
        if height < H and width < W:
            height = height + 1
            steps = steps + 1
            continue

        elif height == H and width < W:
            height = 1
            width = width + 1
            steps = steps + 1
            continue

        elif height < H and width == W:
            height = height + 1
            width = 1
            steps = steps + 1
            continue

        # 코드의 논리적 오류를 최소화 하기위한 형식적 코드
        else:
            pass

    return height, width


for i in range(T):
    H, W, N = map(int, sys.stdin.readline().split())

    get_room_number_for_Nth_customer(H, W, N)

    print(height * 100 + width)

4. 풀이하면서 고민했던 점

  • 일단 쓰면서 로직을 구현하고, 시간이 오래 걸릴것 같으면
    과감히 다른 로직을 구현하자

  • 알고리즘을 구현하는데 너무 시간이 오래걸린다
    다른 방향으로 생각하는 것도 중요하지만, 시간을 절약하는 것도 매우 중요하다.
    10분내외로 생각하고 알고리즘 구현하는 것까지 가능하도록 꾸준히 연습해보자.

  • 최대한 획기적이면서 신선한 로직만이 경쟁력!

5. remind

코드에 대한 이해가 우선이다. sugar syntax보다는 sugar logic!

0개의 댓글