본문 바로가기
코딩 테스트/swea

방울 마술

by ornni 2024. 12. 13.
728x90
반응형

첫번째 코드

 

이때 문제를 잘못 이해하고 있다는 것을 왜 내 나름의 논리로 푼 이후에 생각이 든 것일까...

k를 섞는 개수라고 생각하고 계속 움직여야 한다고 생각하였다...

 

 아래 코드는 완전히 문제와 다른 코드이다..

 

test_case = int(input())

for i in range(test_case):

    cups, move_limit = input().split(' ')
    move_limit = int(move_limit)

    for j in range(3):
        if cups[j] == 'o':
            now = j
            break

    if move_limit == 0:
        answer = j
        print(f'#{i+1} {answer}')
        break

    probability_list = [0, 0, 0]

    def dfs(now, move, probability):
        if move == move_limit:
            probability_list[now] = max(probability_list[now], probability)
            return

        if now == 0:
            dfs(now + 1, move + 1, probability)
        elif now == 2:
            dfs(now - 1, move + 1, probability)
        else:
            now_list = [0, 2]
            probability *= 0.5
            for nows in now_list:
                dfs(nows, move + 1, probability)
    
    dfs(now, 0, 1)

    answer_probability = max(probability_list)
    for k in range(3):
        if probability_list[k] == answer_probability:
            answer = k
            break

    print(f'#{i+1} {answer}')

 

오류 ㅠㅠ

아예 문제 이해를 잘못하고 있었다.


두번째 코드

 

여기서 중요한 것은 가능성을 구한다기 보다는 명확하게 움직인다! 라고 생각하고 움직인다는 것이다.

백날 종이 울리지 않는 컵을 섞는 것은 의미가 없으므로 종이 울리는 컵만을 섞는다고 생각하자

 

또한 같은 가능성의 경우 왼쪽으로 간다고 가정하고 경우를 찾으면 된다.

즉, 0은 1로 움직이지만, 1과 2는 무조건 0과 1로 움직인다고 생각하면 된다.

 

종이 k번 울릴때까지 진행하므로 while문을 사용하여 코드를 작성하였다.

 

test_case = int(input())

for i in range(test_case):

    cups, k = input().split(' ')
    k = int(k)
    ring = 0

    for j in range(3):
        if cups[j] == 'o':
            now = j
            break

    if k == 0:
        answer = j
        print(f'#{i+1} {answer}')
        break

    while ring != k:
        if now == 0:
            now += 1
        elif now == 1:
            now -= 1
        else:
            now -= 1
        
        ring += 1

    print(f'#{i+1} {now}')

 

사실 해당 코드가 틀린 이유를 찾지 못했다...


세번째 코드

 

while문 보다는 어차피 k번 진행하므로 for 문을 사용하여 정리하였다.

근데 여전히 두번쨰 코드가 어디서 오류가 발생했는지는 의문이다...

 

test_case = int(input())

for i in range(test_case):

    cups, k = input().split(' ')
    k = int(k)

    for j in range(3):
        if cups[j] == 'o':
            now = j
            break

    for _ in range(k):
        if now == 0:
            now += 1
        else:
            now -= 1
        
    print(f'#{i+1} {now}')

 

통과!


링크

https://github.com/ornni/programmers/tree/main/SWEA/D3/20934.%E2%80%85%EB%B0%A9%EC%9A%B8%E2%80%85%EB%A7%88%EC%88%A0

 

programmers/SWEA/D3/20934. 방울 마술 at main · ornni/programmers

repository for recording Programmers Algorithm problem solving - ornni/programmers

github.com

 

 

반응형

'코딩 테스트 > swea' 카테고리의 다른 글

식료품 가게  (0) 2024.12.23
육십갑자  (0) 2024.12.20
증가하는 사탕 수열  (0) 2024.12.16
구구단 걷기  (0) 2024.12.06
직사각형과 점  (0) 2024.12.02