본문 바로가기
Programming/Contest

[Code Jam to I/O 2016 for Women] Problem B. Dance Around The Clock

by NAMP 2016. 4. 9.

[Code Jam to I/O 2016 for Women] Problem B. Dance Around The Clock

문제

권위있는 연회장의 소유자는 댄스 플로어에 아름다운 원형 시계를 그렸다.
그리고 1부터 D까지 번호가 매겨진 그룹 D의 댄서들은 문자 그대로 “시계 주위에서 춤춘다”.
그들은 원형으로 서있다.
댄서 1번이 원의 12시에 위치하고
다른 댄서들은 오름차순으로 시계방향으로 원형을 만든다.
댄서의 수는 짝수이다.

춤은 N번 회전한다.
i 번째 턴에, 다음과 같은 일이 일어난다. (1부터 계산)

i가 홀수 인 경우, 현재 12시에 위치한 댄서는 시계방향으로 옆에 있는 댄서와 자리를 바꿉니다. 계속 해서 2명씩의 댄서는 자리를 바꿉니다.

i가 짝수인 경우, 현재 12시에 위치한 댄서는 반시계방향으로 옆에 있는 댄서와 자리를 바꿉니다. 계속 해서 2명씩의 댄서는 자리를 바꿉니다.

예를 들어, 이 그림은 초기 상태 여덟 사람과 두 바퀴 춤을 보여줍니다.

turn

문제를 풀고 답을 제출했는데 계속해서 ‘incorrect’ 만 나온다면 https://www.udebug.com 에서 제출한 답을 확인할 수 있습니다.

3개의 입력값이 주어집니다.
8 3 1

8 은 총 댄서의 수
3 은 찾을 댄서
1 은 회선 수 입니다.

주의해야 할 점은 회전 수의 값이 홀수일 경우와 짝수일 경우가 다르다는 것입니다.
배열로 처리할 경우, 맨 처음과 마지막 값을 변경하는 경우를 신경써야 합니다.

파이썬 전체 소스

def solveOne(d,k,n):
    dh = int(d/2)
    dancers = []
    for i in range(d):
        dancers.append(i+1)
    # print(dancers)
    for i in range(n):  # 횟수
        if (i+1) % 2 == 1 :
            ## 홀수인 경우
            for j in range(dh):
                dancers[j*2], dancers[j*2+1] = dancers[j*2+1], dancers[j*2]
        else:
            ## 짝수인 경우
            for j in range(dh-1):
                dancers[j*2+1], dancers[j*2+2] = dancers[j*2+2], dancers[j*2+1]
            dancers[0], dancers[d-1] = dancers[d-1], dancers[0]
        #print(dancers)
    idx = dancers.index(k)
    leftIdx = idx + 1
    if leftIdx > d-1:
        leftIdx = 0
    rightIdx = idx - 1
    if rightIdx < 0:
        rightIdx = d -1

    rst = []
    rst.append(dancers[leftIdx])
    rst.append(dancers[rightIdx])

    return rst


def main():
    inputFile = "B-small-practice.in"
    outFile = inputFile + ".out"

    inpf = open(inputFile, "r")
    outf = open(outFile, "w")

    testCase = int(inpf.readline())
    for case in range(testCase):
        d, k, n = [int(x) for x in inpf.readline().strip().split(' ')]
        rst = solveOne(d, k, n)
        result = 'Case #{}: {}\n'.format(case+1, ' '.join(str(v) for v in rst))
        print(result, end="")
        outf.write(result)
    inpf.close()
    outf.close()

if __name__ == "__main__":
    main()

참고


'Programming > Contest' 카테고리의 다른 글

[coderbyte] First Reverse  (0) 2016.04.08
[checkio] House password  (0) 2016.04.07
[checkio] Median  (0) 2016.04.06
[checkio] Non-unique Elements  (0) 2016.04.05
[codingame] The Descent  (0) 2014.12.13

댓글