메시지 전달
입력 도움말: 5마리의 소가 있다. 1번째 소는 메시지를 전달하지 않고, 2번째 소는 4번째 소한테 메시지를 전달 하고, 같은 방식으로 진행된다. 출력 도움말: 1번째 소는 메시지를 전달 하지 않으��
codeup.kr
이 문제는 백준에는 없는 듯하다.
그래서 코드업 얘기를 하자면, 이 문제를 통과한 유저는 100명이 채 되지 않는다! (당시기준)
맞춘 유저가 100명이면 코드업 중에서는 주로 조금 어려운 문제에 속하지만, 이 문제는
생각만 잘하면 쉽게 풀리는 문제이다!
풀이
핵심은 이것이다.
확정할 수 있는 'loopy' 하지 않은 소가 메시지를 전달해야 하는 소는 없다.
또한 'loopy'한 소에게 메시지를 전달하는 소도 'loppy'하다.
예를 들어, 5 0 4 1 5 4 와 같이 입력된다고 할 때,
확정할 수 있는 'loopy' 하지 않은 소는 1번 소이다. (가리키는 소가 0이기 때문)
그 다음부터는 loopy 하지 않은 소에게 메시지를 전달하는 소를 찾으면 된다.
예를 들어, A는 loopy 하지 않은 소이다. B는 A를 가리킨다. C는 B를 가리킨다.
이 경우, loopy 하지 않은 소는 A와 B 뿐만 아니라, C도 loopy 한 소가 아니다.
때문에, loopy 하지 않는 소를 가리키는 소를 찾는것을 넘어서, 그 'loopy 하지 않은 소를 가리키는 소'를 가리키는 소도 찾아야 된다. 때문에, 그 ''loppy 하지 않는 소를 가리키는 소'를 가리키는 소'도 찾아야한다.
이 행위를 하기 위해서는 반복문으로 반복을 N번 반복하면서 계속 탐색을 해주어야 한다.
그 N번 탐색하면서 해야할 일은, 모든 소를 탐색하며 '해당 소가 가리키는 소가 loppy 한 소인가? (0인가? <-- loopy한 소의 번째수의 인덱스는 0으로 저장하기 때문)
이를 코드로 나타내면 if(a[a[j]]==0) 인데 복잡할 수 있으니 풀어서 설명해보겠다.
여기서 a[j]는 해당 소가 가리키는 소의 값이다. 그러니 a[j]번째 소가 가리키는 소의 값이 0이면 loppy 한 소이다.
여기서 a[j]번째 소가 가리키는 소를 코드로 나타내면, a[ a[j] ] 가 되겠다.
지금까지 말한 내용들을 코드로 구현하면 다음과 같다.
코드로 글을 마친다.
'C 알고리즘' 카테고리의 다른 글
BOJ 6588 : 골드바흐의 추측 (0) | 2021.03.13 |
---|---|
BOJ 1262 : 두 번째로 작은 스패닝 트리 (1) | 2020.10.04 |
코드업 3290 : 최소 비용 신장 트리 (0) | 2020.08.14 |
코드업 3410 : 금고 열기 (2) | 2020.08.13 |
코드업 1615 : 셀프 넘버(Self-Number) (5) | 2020.05.26 |