[백준]14891번 톱니바퀴 -python 파이썬

2024. 10. 12. 01:58·코딩테스트/백준

문제

 

 

 

이 문제는 구현하는 알고리즘을 생각하는게 까다롭다기보다는 조건이 너무 많아서 구현하는게 까다로운 문제이다.

 

일단 반시계방향 시계방향으로 돌게 하는 함수부터 따로 만들어주는 것으로 시작하였다. 이때 검색해보니 deque를 활용해서 roatate함수를 활용하신 분이 많던데 나는 이 방법을 몰라서 직접 구현했다... 내장함수 쓰는게 훨씬 간편할듯,,,

 

그리고 처음에 헷갈린 부분이 한번 회전을 할 때 하나의 톱니바퀴가 움직이면 한번의 회전 내에서 톱니바퀴를 바로 움직여서 옆의 톱니바퀴는 회전된 톱니바퀴를 기준으로 하도록 했는데

 

문제를 보면 알겠지만 k번의 회전중 한 번의 회전을 하는 동안에는 내부의 톱니바퀴가 움직이지 않은 값을 기준으로 맞닿은 부분을 확인해주어야한다.

그렇기 때문에 한번 회전할 때 어떤 톱니바퀴가 어떤 방향으로 회전할지 체크해준 이후에 톱니바퀴를 회전한 값으로 업데이트 해주어야한다.

 

 

그리고 회전하는 톱니바퀴 기준 왼쪽 오른쪽을 나누어서 확인해 주었다.

 

전체코드

def sigye(toapn):
    last= toapn[-1]
    toapn[1:] = toapn[0:7]
    toapn[0] = last
    return toapn

def bansigye(toapn):
    first= toapn[0]
    toapn[0:7] = toapn[1:]
    toapn[-1] = first
    return toapn

toap = []
for i in range(4):
    toap.append(list(input()))

k = int(input())


for _ in range(k):
    n,s = map(int, input().split())
    scheck =[0] *4
    #회전한 톱니바퀴 인덱스에 맞추어 마이너스
    n -= 1
    scheck[n] = s

    #n번째 톱 이전의 톱 돌리기
    for i in range(n-1,-1,-1):
        #맞닿은 극이 반대일 때
        if toap[i+1][6] != toap[i][2]:
            if scheck[i+1] == 1:
                scheck[i] = -1
            if scheck[i+1] == -1:
                scheck[i] = 1
        else:
            #회전이 더이상 없으므로 브레이크
            break
    #n번째 톱 이후의 톱 돌리기
    for i in range(n+1,4):
        #맞닿은 극이 반대일 때
        if toap[i][6] != toap[i-1][2]:
            if scheck[i-1] == 1:
                scheck[i] = -1
            if scheck[i-1] == -1:
                scheck[i] = 1

        else:
            #회전이 더이상 없으므로 브레이크
            break
    #이번 회전에서의 극의 값에 따른 회전여부 저장해서 한번에 회전
    for i in range(4):
        if scheck[i] == 1:
            toap[i] = sigye(toap[i])
        if scheck[i]== -1:
            toap[i] = bansigye(toap[i])
    

ans = 0


for i in range(4):
    if toap[i][0] == "1":
        ans += pow(2,i)
#print(toap)
print(ans)

 

 

 

단순 구현 문제중에 문제가 너무 길고 조건이 많아서 까다로운 문제가 있는데 이 문제가 딱 그런 유형이였던 것 같다.

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

[백준]1068번 트리 - ptyhon파이썬  (2) 2024.10.16
[백준] 2565번 전깃줄 - python 파이썬  (1) 2024.10.14
[백준] 2294번 동전2 -python 파이썬  (1) 2024.10.12
[백준] 2493번 탑 - python 파이썬  (2) 2024.10.06
[백준] 1107 리모컨 - python 파이썬  (1) 2024.07.22
'코딩테스트/백준' 카테고리의 다른 글
  • [백준]1068번 트리 - ptyhon파이썬
  • [백준] 2565번 전깃줄 - python 파이썬
  • [백준] 2294번 동전2 -python 파이썬
  • [백준] 2493번 탑 - python 파이썬
hiwon
hiwon
천천히 굴러가는 코딩일기
  • hiwon
    하이원의 코딩 일기
    hiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (83)
      • 프론트엔드 (0)
        • react (0)
      • 백엔드 (13)
        • node.js (1)
        • spring (6)
      • 코딩테스트 (57)
        • 백준 (41)
        • 프로그래머스 (15)
      • 프로디지털아카데미 (9)
        • 클라우드 (1)
        • JavaScript (1)
      • github (1)
      • AWS (2)
      • Infra (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬
    BFS
    깃허브
    코테
    프로그래머스
    프디아
    github
    알파코캠퍼스
    신한투자증권
    프로디지털아카데미
    백준
    코딩테스트
    bastion host
    백엔드
    kdt교육
    python
    spring
    MSA
    EC2
    알파코
    알고리즘
    백트래킹
    다익스트라
    그리디
    AWS
    Java
    UnionFind
    K디지털트레이닝
    투포인터
    IT기획
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hiwon
[백준]14891번 톱니바퀴 -python 파이썬
상단으로

티스토리툴바