본문 바로가기

정보올림피아드 기출문제 풀이

저울

4805 : 저울

시간 제한: 1 Sec  메모리 제한: 512 MB
제출: 21  해결 문제 수: 8
이 문제 1위 : admin
문제 설명   

문제4) 저울 (초등4, 중등3, 고등2)

무게가 서로 다른 N개의 물건이 있다. 각 물건은 1부터 N 까지 번호가 매겨져 있다.

우리는 일부 물건 쌍에 대해서 양팔 저울로 어떤 것이 무거운 것인지를 측정한 결과표를 가지고 있다.

이 결과 표로부터 직접 측정하지 않은 물건 쌍의 비교 결 과를 알아낼 수도 있고 알아내지 못할 수도 있다.

예를 들어, 총 6개의 물건이 있고, 다음 5개의 비 교 결과가 주어졌다고 가정하자. ([1]은 1번 물건 의 무게를 의미한다.)

[1]>[2], [2]>[3], [3]>[4], [5]>[4], [6]>[5]

우리는 [2]>[3], [3]>[4]로부터 [2]>[4]라는 것 을 알 수 있다.

하지만, 물건 2와 물건 6을 비교 하는 경우, 앞서의 결과만으로는 어느 것이 무거 운지 알 수 없다.

이와 같이, 물건 2는 물건 1, 3, 4와의 비교 결과는 알 수 있지만, 물건 5, 6과의 비교 결과는 알 수 없다.

물건 4는 모든 다른 물 건과의 비교 결과를 알 수 있다.

비교 결과가 모순되는 입력은 없다고 가정한다.

위 예제의 기존 측정 결과에 [3]>[1]이 추가되었 다고 가정하자.

이 경우 [1]>[2], [2]>[3]이므로 우리는 [1]>[3]이라는 것을 예측할 수 있는데, 이는 기존에 측정된 결과 [3]>[1]과 서로 모순이므로 이러한 입력은 가능하지 않다.

물건의 개수 N과 일부 물건 쌍의 비교 결과가 주어졌을 때, 각 물건에 대해서 그 물건과의 비교 결과를 알 수 없는 물건의 개수를 출력하는 프로 그램을 작성하시오.

입력

입력파일의 첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에 는 미리 측정된 물건 쌍의 개수 M이 주어진다.

단, 5 ≤N ≤100이고, 0 ≤M ≤2,000이다.

다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩 주어진다.

각 줄에는 측정된 물건 번 호를 나타내는 두 개의 정수가 공백을 사이에 두 고 주어지며, 앞의 물건이 뒤의 물건보다 더 무겁 다.

출력

여러분은 N개의 줄에 결과를 출력해야 한다. i 번째 줄에는 물건 i 와 비교 결과를 알 수 없는 물건의 개수를 출력한다.

입력 예시

6 5 1 2 2 3 3 4 5 4 6 5

출력 예시

2 2 2 0 3 3

쉽지 않은 문제입니다.


우선 저도 풀려고 시도하다 보면


[1]>[2], [2]>[3], [3]>[4], [5]>[4], [6]>[5]


이 관계는 


이렇게 놓일수 있다는 걸 알 수 있습니다.


그런데 이걸 어떻게 푸냐면


잘 보시면 부등식을 배우면 아시겠지만(몰라도 암)


1>2 2>3 3>4 에서


1>3


1>4


2>4


의 관계를 알아내실 수 있습니다.


그럼 이렇게 됩니다.


그럼 한번 1의 입장에서 봅시다.



2,3,4와는


연결이 되어 있는데


5와 6과는 연결이 되어 있지 않습니다


그러므로 2입니다.



그럼 이번엔 5의 입장에서 봅시다.



4와 6은 아는데 1,2,3은 모릅니다.


고로 3임을 알 수 있습니다.


고로 단방향 간선이던 양방향 간선이던


서로 연결이 되지 않은 부분만 찾으면 됩니다.


우선 요걸 인접행렬로 나타내봅시다.


인접행렬이 뭐냐면


1과 2가 연결되어 있다면 배열이름[1][2] 에 표시하는건데


나중에 그것과 관련해서 쓰도록 하겠습니다.




이렇게 됩니다


저 빨간선은 대칭축입니다.


자 이제 여기서


이런식으로 바꿔야합니다.


그러면 어떻게해야될까요?


1>2>3에서 1>3을 알아내는법은


배열[1][2]가 1이면


배열[2][1]~ 배열[2][6]까지 쭉 스캔하는겁니다


그래서 만약 맞는게 있으면


배열[2][3]이 1이잖아요


그러면 결국 배열[1][3]도 연결되어 있다는 소리가 됩니다


이런식으로 합시다




요렇게 됩니다.


자 이제 여기서 연결되어있는지 안되어있는지를 체크할라면


배열[1][1] ~ 배열[1][6]


까지를 보면




주황색



배열[1][2] 와 배열 [2][1]이 모두 0이여야됩니다.


왜냐고요?


생각을 해보시면 아시겠지만


배열[1][2]가 1이면 두개는 연결되어있다는소리고


배열[2][1]이 1이면 그것도 관계를 알 수 있는 겁니다.


그럼 여기서 배열[1][2] = 0, 배열[2][1] = 0


이면 됩니다.


그리고 그때마다 +1을 해줘서 그 값을 출력하는것을


반복하면 끝입니다.


여기서 중요한 점은 대칭축을 꼭 빼줘야한다는점입니다


arr[1][1]이나 arr[2][2]는 무조건 0이기때문에 둘다 더해도 0이기때문에


빼야합니다


문제 난도가 좀 있네요.. 풀어봅시다




그림 순서대로하면 이렇게됩니다


1번은 입력


2번은 맞게 바꾸고


3번은 체크하는겁니다


count에 -1을하는이유는


대칭축 때문입니다.


이게 고등부2 중등부3 초등부4인데


정올에서 이런문제나오면 풀수 있을지 모르겠습니다 ㅠㅠ


이상입니다







'정보올림피아드 기출문제 풀이' 카테고리의 다른 글

숫자 등고선  (0) 2015.05.08
자리배정  (2) 2015.05.05
검증수  (0) 2014.11.08
과자  (2) 2014.09.26
거품 정렬  (0) 2014.09.14