GameChoi
Choi Programming
GameChoi
전체 방문자
오늘
어제
  • 분류 전체보기 (468)
    • C++ Algorithm & Study (184)
      • C++ & Algorithm Strategies (45)
      • Game Math & DirectX 11 (72)
      • Server + UE5 (29)
      • Lyra Clone Coding (37)
    • Create Game (284)
      • [Window API] Game Client & .. (55)
      • [DirectX] DirectX 2D & 3D (155)
      • [UE5] BLUEPRINT & C++ (74)
    • odds and ends (0)
      • English (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Algorithm Strategies
  • core
  • Direct3D
  • c++
  • Network Worker
  • Direct11
  • session
  • Game Server
  • Player State
  • Other Character
  • server
  • Player Move Packet
  • Destination Move Packet
  • job queue
  • UE5
  • GAME Client
  • Game Room
  • protobuf
  • client
  • RPG Game

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
GameChoi

Choi Programming

[Algorithm Strategies] 05. Exhaustive Search - Clock Sync
C++ Algorithm & Study/C++ & Algorithm Strategies

[Algorithm Strategies] 05. Exhaustive Search - Clock Sync

2023. 7. 13. 18:39

1. Exhaustive Search

1.1 Clock Sync - Optimization Problem

1.1.1 Problem

- 4 X 4 격자 형태로 배치된 열어섯 개의 시계가 존재, 이 시계들은 12시, 3시, 6시, 9시를 가리키고 있음

   - 이 시계들을 모두 12시를 가리키도록 변경, 시간을 조작하는 유일한 방법은 열개의 스위치들을 조작하는 것

     - 각 스위치들은 모두 적게는 세 개에서 많게는 다섯 개의 시계에 연결

       - 한 스위치를 누를 때 마다 해당 스위치와 연결된 시계들의 시간은 3시간씩 앞으로 움직임

스위치 번호 연결된 시계들 스위치 번호 연결된 시계들
0 0, 1, 2 5 0, 2, 14, 15
1 3, 7, 9, 11 6 3, 14, 15
2 4, 10, 14, 15 7 4, 5, 7, 14, 15
3 0, 4, 5, 6, 7 8 1, 2, 3, 4, 5
4 6, 7, 8, 10, 12 9 3, 4, 5, 9 ,13

 - 첫 줄에 테스트 케이스 개수가 주어지고, 각 테스트 케이스는 한 줄에 16개의 정수로 주어짐

   - 각 정수는 0번부터 15번까지 각 시계가 가리키고 있는 시간을 12, 3, 6, 9중 하나로 표현

/* Input*/
2
12 6 6 6 6 6 12 12 12 12 12 12 12 12 12 12
12 9 3 12 6 6 6 9 3 12 9 12 9 12 12 6 6

/* Output */
2
9

1.1.2 Algorithm Strategy

- 시계는 12시간이 지나면 제 자리로 돌아온다는 점을 이용하면 무한한 조합의 수를 유한하게 변경 가능

   - 어떤 스위치를 최대 세번 이상 누를 일은 존재X

 - 2차원 벡터를 생성하여 스위치와 연결되어 있는 시계를 생성

vector<vector<int>> ConnectedSwitch;

 - 시계를 스위치에 의해 변경되는 것은 함수로 따로 설정하여 생성

   - 이후 재귀 함수를 통해 시계가 모두 12시로 향하게 만드는 함수 생성하여 문제를 풂

void Exhaustive::ChangeClock(vector<int>& clock, int sch);

1.1.3 implementation

1.1.3.1 Main Function

 - 메인 함수에서 입력을 따로 받지 않고 넣는 방식을 사용

vector<int> clock {12, 6, 6, 6, 6, 6, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12};
//vector<int> clock {12, 9, 3, 12, 6, 6, 9, 3, 12, 9, 12, 9, 12, 12, 6, 6};
cout << exhaustive.ClockSync(clock, 0) << endl;

1.1.3.2 Change Clock

 - 시계와 스위치를 전달받아 스위치에 해당하는 시계들을 찾아 값 변경

for (int i = 0; i < ConnectedSwitch[sch].size(); i++)
{
    clock[ConnectedSwitch[sch][i]] += 3;
    if (clock[ConnectedSwitch[sch][i]] == 15) clock[ConnectedSwitch[sch][i]] = 3;
}

1.1.3.2 Clock Sync

int Exhaustive::ClockSync(vector<int>& clock, int sch);

 - 마지막인 10번인 스위치가 3번 눌렸을 때 시계가 12시를 바라보지 않을 경우 무한대의 값 반환

if (sch == 10) return areAligned(clock) ? 0 : INTMAX;

   - 스위치를 0번 누르는 경우의 수 부터 3번 누르는 경우의 수까지 모두 시도

     - 4번을 누를 경우 원래 자리로 돌아옴

       - 즉 0번 부터 9번까지를 스위치 3번을 누르면서 모든 경우의 수를 추출

int ret = INTMAX;
for (int i = 0; i < 4; i++)
{
    ret = min(ret, i + ClockSync(clock, sch + 1)); ChangeClock(clock, sch);
}
return ret;
저작자표시 (새창열림)

'C++ Algorithm & Study > C++ & Algorithm Strategies' 카테고리의 다른 글

[Algorithm Strategies] 06. Divide & Conquer - Karatsuba Multipy  (0) 2023.07.14
[Algorithm Strategies] 04. Exhaustive Search - Traveling Sale  (0) 2023.07.12
[Algorithm Strategies] 03. Exhaustive Search - Board Cover  (0) 2023.07.12
[Algorithm Strategies] 02. Exhaustive Search - Picnic  (0) 2023.07.11
[Algorithm Strategies] 01. Exhaustive Search - Boggle  (0) 2023.07.10
    'C++ Algorithm & Study/C++ & Algorithm Strategies' 카테고리의 다른 글
    • [Algorithm Strategies] 06. Divide & Conquer - Karatsuba Multipy
    • [Algorithm Strategies] 04. Exhaustive Search - Traveling Sale
    • [Algorithm Strategies] 03. Exhaustive Search - Board Cover
    • [Algorithm Strategies] 02. Exhaustive Search - Picnic
    GameChoi
    GameChoi

    티스토리툴바