For Programmer

백준 10158번 파이썬 문제풀이(개미) 본문

코팅테스트/백준 문제 모음

백준 10158번 파이썬 문제풀이(개미)

유지광이 2022. 1. 31. 22:12
728x90


이 문제는 그래프를 보고 해당 45도 꺽이는 걸 코드로 구현할려고 하면 힘들다. 그러나 값의 좌표를 보면 열좌표는 4,5,6,5,4,3,2,1,0,1...... 행좌표는 1,2,3,4,3,2,1....... 과 같이 0~w , 0~h 까지 반복되는 것을 알 수 있다. 그러니 이를 반복문을 돌리면서 찾을려고 하면 당연히 0.15초가 시간제한이기 때문에 시간초과가 뜬다. 따라서 이를 해결하기 위해서는 수학식(점화식)을 찾아야 한다. -> 이부분이 정말 어렵다....... 지금 답을 보고도 사실 실제 시험때 바로 해당 식을 찾을 수 있을까 라는 의문이 든다.

w, h = map(int, input().split())
p, q = map(int, input().split())
t = int(input())

a = (p + t) // w  # 증가하는 부분인지 감소하는 부분인지 확인
b = (q + t) // h  # 증가하는 부분인지 감소하는 부분인지 확인

if a % 2 == 0:  # 해당 값이 증가하는 부분이라면
    x = (p + t) % w
else:  # 해당 값이 감소하는 부분이라면
    x = w - (p + t) % w

if b % 2 == 0:  # 해당 값이 감소하는 부분이라면
    y = (q + t) % h
else:  # 해당 값이 감소하는 부분이라면
    y = h - (q + t) % h

print(x, y)

 

다음은 시간초과 코드이다.

w, h = map(int, input().split())
p, q = map(int, input().split())
t = int(input())

r = q  # 초기 행값 저장
c = p  # 초기 열값 저장
count = 0  # 시간을 셀 변수
cycle_c = 1  # 열이 증가하는지 감소하는지 체킹변수
cycle_r = 1  # 행이 증가하는지 감소하는지 체킹 변수
while True:

    if r == h:  # 만약 행이 젤 끝인덱스라면
        cycle_r = -1  # 사이클을 반대로
    elif r == 0:  # 만약 행이 처음이라면
        cycle_r = 1  # 사이클을 반대로

    if cycle_r == 1:  # 만약 증가 사이클이라면
        r += 1  # 증가
    elif cycle_r == -1:  # 만약 감소사이클이라면
        r -= 1  # 감소

    if c == w:  # 만약 열이 젤 끝 인덱스라면
        cycle_c = -1  # 사이클을 반대로
    elif c == 0:  # 만약 열이 처음이라면
        cycle_c = 1  # 사이클을 반대로

    if cycle_c == 1:  # 만약 증가 사이클이라면
        c += 1  # 증가
    elif cycle_c == -1:  # 만약 감소사이클이라면
        c -= 1  # 감소

    count += 1  # 위에 실행이 한번 되었다면 시간 증가

    if count == t:  # 만약 시간이 입력받은 시간과 동일하다면
        print(c, r)  # 해당 열,행 출력
        break  # 반복문 탈출
728x90
Comments