앞으로 PS는 기출문제 모음에서 풀어보려고 한다!
30분 내에 끝내고 싶었는데 33분 정도 걸렸다
그런데 이게 과연 Lv1
이 맞는지..
선물을 주고 받고, 이름과 이름으로 주어진다는 점에서
Map<이름, 인덱스 번호>
를 선언해서 바로 꺼낼 수 있도록 하고 그 인덱스로 그래프를 표현하면 될 듯 싶었음
그런데 인접리스트에 익숙해져있는 터라 당연히 인접리스트로 구현해야지 했는데
어떻게 A가 보낸 선물의 수
, A가 받은 선물의 수
를 쉽게 구할 수 있을지 막막했다
자료형을 더 가져오기엔 나조차도 로직을 잊을 것 같아서... 실제로 풀다가 잊었음
그래서 문제에서 보여준 풀이를 봤는데 인접행렬로 표현했음
그래서 받은 개수와 준 개수를 같이 저장하면 될 것 같았다
이걸 그려놓고 했다면 좀 더 명확했을까..
그래서
1. `Map` 자료형에 `<이름, 인덱스>` 세팅
2. 서로 주고받은 선물의 수를 인접행렬에 저장
3. 각각 최댓값과 최솟값을 저장
4. 인접행렬을 보면서 누가 많이 받았는지를 보고 받을 선물의 수를 저장한다.
4-1. 같은 양을 받았다면 저장한 최대/최솟값으로 선물지수를 계산해 받을 선물의 수를 저장한다.
5. 전체를 보면서 최댓값을 저장하고 리턴
로직으로 작성했다.
다음 달에 선물을 받을 친구들 중 최댓값을 출력해야하는데, 이를 제대로 못보고 이번 달 선물의 수를 합해서 한번 틀렸음. 그걸 고치니 solved를 얻긴했다
또한.. 아쉬웠던 점은 주석으로 로직을 구체화한 뒤 코드로 구현한 것이 아니라 반대로 했다는 점이다. 게다가 시간복잡도도 따로 생각하지 않았음.
1시간이 지나도 결국 풀지 못했다.
문제를 풀다가 간과했던 부분은
이 두가지 경우이다.
내가 판단했던 부분은
도넛 : 처음으로 돌아오고 나가는 간선은 1개
막대 : 처음으로 못오고 나가는 간선은 0~1개
8자 : 처음으로 돌아오고 나가는 간선은 1~2개
즉, 나가는 간선이 2개가 있다면 8자로 return
나가는 간선이 0개가 있다면 막대로 return
나머지는 도넛
이었는데,
1번 그림에서 ?
노드에서 방문처리 후 위쪽 루트로 먼저 ?
로 왔을 때 간선이 2개로 갈라지지 않아서 아직 8자
임을 모른다.
또한, 밑의 루트로 갔던 노드도 중간노드에서 갈 수 있는 루트가 없기 때문에 8자
임을 판단할 수 가 없다.
그래서 결국 방문에 관계없이 간선이 2개 이상 존재하는 노드가 있다면 8자
로 판단하게끔 했고 이 경우는 통과하는 듯 했음
2번의 경우 여기선 생성한 정점을 찾기가 어렵다는 점이다.
기존엔 들어오는 간선이 없고 나가는 간선만 있는 정점을 생성한 정점이라 판단했었는데, 막대그래프의 시작정점 또한 같은 특성을 띄기 때문이었다.
물론, 막대그래프는 한 노드당 나가는 간선이든 들어오는 간선이든 하나씩 존재한다는 특징이 있지만, 생성된 정점과
..적다보니 조건을 빠트렸음을 깨달았다.
도넛 모양 그래프, 막대 모양 그래프, 8자 모양 그래프의 수의 합은 2이상입니다.
라는 조건으로 될 수 없구나.
그러면 생성된 정점은
1. 2개 이상의 나가는 간선을 가진다.
2. 들어오는 간선이 없다.
로 구분할 수 있음이 명확해졌다.
혹시나 해서 해당 조건을 추가해 제출해봤는데
맞았다..!!
이게 어떻게 Lv2
인지 싶지만.. 실제 코테에서도 못풀었던 문제인데 풀어서 상당히 뿌듯하다!
물론 다음에 꼭 풀어볼 것이고 그땐.. 30분안에 풀리라
한문제를 더 풀어볼까 했지만 Lv3
이고 지금 1시라 포기했다.
내일 풀 주사위 고르기
문제는 빠르게 풀 수 있기를...
최근 인프런에서 CS 책 10회독 스터디를 계속 구인하길래 신기해서 참여했다.
정말 다들 열심히 3일에 1회독을 실천하고 계셔서 나도 10회독을 해보고 싶어 책을 사고 배송 온 시점부터 진행하기로 했는데 어제 도착했다.
열심히 필기하면서 내것으로 만들어야지.
크 7장 필기했다.
이제 싸피 퇴근하고 집가서 Spring 공부해야지~~
환경 세팅에 생각보다 시간이 오래 걸려서
공부는 많이 못했음
내일도 화이팅이다!