본문 바로가기

Problem Solving/코딩 인터뷰 완전분석

루프 발견

반응형

2.8 문제 - 루프 발견




순환 연결리스트가 주어졌을때, 순환되는 부분의 첫째 노드를 반환 하는 알고리즘을 작성하라. 


순환 연결리스트란 노드의  next 포인터가 앞선 노드들 가운데 어느 하나를 가리키도록 설정되어 있는 변질된 방식


의 연결리스트를 의미한다.



입력:  A > B > C > D >E> C (앞에 나온 C와 같음) // 입력 0 > 1 > 2 > 3> 4> 5> 6> 7> 8> 9> 10 > 3


출력 : C                                                       // 출력 3




        
문제 해결 방법


1. 연결리스트에서 순환 구조의 유무 검사 


-탐색 속도가 다른 2개의 포인터를 이용.   (RUNNER 기법)


-SLOW: P만큼 나아갈때 1칸


-FAST: 2P만큼 나아간다 2칸


-이용해서 만나면 순환구조가 있다고 볼 수 있다.


-루프가 아닌부분의 크기를 K 라고 가정


-SLOW가 K만큼 움직여서 루프의 시작 부분에 도착하면


-FAST는 2K 만큼 나아감. -루프의 시작에서 K만큼 더 진입 


루프의 크기보다 K가 더 큰 일 수 있어서 


K= MOD( K,  LOOP의 크기)= 3 % 8 =3 


(LOOP의 크기 - K )의 횟수 만큼 이동


결국 만나는 지점은 루프의 시작에서 K만큼 뒤쳐짐


둘이 만나면 순환 구조 유무 확인


2. 순환의 시작 부분을 찾는것


SLOW를 리스트의 시작지점으로 변경


FAST는 그대로 두고 속도는 같에 변경하고


루프의 시작지점에서 충돌


이 노드를 반환











반응형

'Problem Solving > 코딩 인터뷰 완전분석' 카테고리의 다른 글

2진수를 문자열로  (0) 2018.12.29
4.6 후속자  (0) 2018.12.15
4.5 BTS 검증  (0) 2018.12.15
4.4 균형 확인  (0) 2018.12.15
루프 발견 구현  (0) 2018.12.01