본문 바로가기

3101 with 파이썬 본문

Algorithms/Simulation

3101 with 파이썬

Louisus 2020. 8. 12. 17:51
728x90
# 1. 배열판 만들기
# 2. 움직인 칸 합
# 3. 합 출력

## 메모리 초과

n, k = map(int, input().split())
jumps = list(input())
fields = [[0]*n for _ in range(n)]
# U D L R
dirs = {'U': (-1, 0), 'D': (1, 0), 'L': (0, -1), 'R': (0, 1)}
answer = [1]

def make_zigzag_list(fields, n):
    cnt = 1
    fields[0][0] = cnt
    change_dir = 0

    for i in range(1, n):
        a = list(range(i+1))
        b = list(range(i, -1, -1))
        if change_dir == 0:
            for y, x in zip(a, b):
                cnt += 1
                fields[y][x] = cnt
            change_dir += 1
        else:
            for y, x in zip(b, a):
                cnt += 1
                fields[y][x] = cnt
            change_dir -= 1

    for i in range(1, n):
        a = list(range(n-1, i-1, -1))
        b = list(range(i, n))

        if change_dir == 1:
            for y, x in zip(a, b):
                cnt += 1
                fields[y][x] = cnt
            change_dir -= 1
        else:
            for y, x in zip(b, a):
                cnt += 1
                fields[y][x] = cnt
            change_dir += 1

def move(fields, now, dir):
    y, x = now
    dy, dx = dirs[dir]
    ny, nx = y + dy, x + dx
    answer.append(fields[ny][nx])

    return (ny, nx)

make_zigzag_list(fields, n)

# 움직이기
now = (0, 0)
for jump in jumps:
    now = move(fields, now, jump)
print(sum(answer))
# 1. 각 지그재그 라인별 첫번째 숫자 파악
# 2. 현위치에서 요구대로 이동
# 3. 이동한 위치에 해당하는 지그재그 라인을 N 보다 작은 부분과 큰부분으로 나눔
# 4. 라인 번호를 홀짝으로 나눠 진행 방향을 정함
# 5. 이동한 위치의 값을 시작 숫자와 현재 위치를 기준으로 구함
# 6. 결과값에 합산
# 7. 최종 결과 값 출력

N, K = map(int, input().split())
# 현재 위치
R, C = 1, 1
# 첫번째 등장하는 숫자 1번부터 시작
firstNumbers = [0] * (N * 2)
firstNumbers[1] = 1

def getLength(lineNo):
    # 1 2 3 4 5 6 
    if lineNo <= N:
        return lineNo

    # 5 4 3 2 1
    return N - lineNo % N

for i in range(2, N * 2):
    firstNumbers[i] = firstNumbers[i - 1] + getLength(i - 1)

# [0, 1, 2, 4, 7, 11, 16, 22, 27, 31, 34, 36]
# print(firstNumbers)

def getNumber(r, c):
    lineNumber = r + c - 1
    firstNumber = firstNumbers[lineNumber]
    # 증가
    if lineNumber <= N:
        # 짝수번째 줄
        if lineNumber % 2 == 0:
            # 해당줄에서 값이 증가할수록 r도 증가
            return firstNumber + (r - 1)
        # 홀수번째 줄
        else:
            # 해당줄에서 값이 증가할수록 c도 증가
            return firstNumber + (c - 1)
    # 감소
    else:
        if lineNumber % 2 == 0:
            # 값이 증가할수록 c는 감소
            return firstNumber + (N - c)
        else:
            # 값이 증가할수록 r은 감소
            return firstNumber + (N - r)

result = 1
# 상하좌우 움직이기
# for ch in input().rstrip():
for ch in list(input()):
    if ch == 'U':
        R -= 1
    elif ch == 'D':
        R += 1
    elif ch == 'L':
        C -= 1
    elif ch == 'R':
        C += 1
    result += getNumber(R, C)

print(result)

'Algorithms > Simulation' 카테고리의 다른 글

6416 with 파이썬 (-)  (0) 2020.08.12
블록 이동하기 with 파이썬  (0) 2020.08.07
외벽 점검 with 파이썬  (0) 2020.08.07
추석트래픽 with 파이썬  (0) 2020.08.06
자물쇠와 열쇠 with 파이썬  (0) 2020.08.06
Comments