For Programmer
백준 10158번 파이썬 문제풀이(개미) 본문
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
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 1009번 파이썬 문제풀이(분산처리) (0) | 2022.02.01 |
---|---|
백준 10163번 파이썬 문제풀이(색종이) (0) | 2022.02.01 |
백준 10157번 파이썬 문제풀이(자리배정) (0) | 2022.01.31 |
백준 2527번 파이썬 문제풀이(직사각형) (0) | 2022.01.30 |
백준 2477번 파이썬 문제풀이(참외밭) (0) | 2022.01.28 |
Comments