일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- MLQ
- 설탕뽑기
- 100제
- 문해력 수업
- 운영체제
- 운영체제의 구동
- 프로세스개념
- 코드업 배열
- 가즈아
- 100제 문제
- 기초 100제
- 프로그래머스
- 다할수있다
- 자바
- 책
- Java
- 코드업
- 운영체제의 분류
- 운영체제의역할
- MFQ
- 네트워크
- 해커랭크
- 성실한 개미
- 양뱡향
- 2차원 달팽이 배열
- 코딩을지탱하는기술
- 운영체제 컴퓨터 향상
- CPU 스케줄링
- 운영체제 개요
- 2차원행열
- Today
- Total
개발로그
[프로그래머스] 순위- JAVA 본문
n명의 권투선수가 권투 대회에 참여했고 각각 1번부터 n번까지 번호를 받았습니다. 권투 경기는 1대1 방식으로 진행이 되고, 만약 A 선수가 B 선수보다 실력이 좋다면 A 선수는 B 선수를 항상 이깁니다. 심판은 주어진 경기 결과를 가지고 선수들의 순위를 매기려 합니다. 하지만 몇몇 경기 결과를 분실하여 정확하게 순위를 매길 수 없습니다.
선수의 수 n, 경기 결과를 담은 2차원 배열 results가 매개변수로 주어질 때 정확하게 순위를 매길 수 있는 선수의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- 선수의 수는 1명 이상 100명 이하입니다.
- 경기 결과는 1개 이상 4,500개 이하입니다.
- results 배열 각 행 [A, B]는 A 선수가 B 선수를 이겼다는 의미입니다.
- 모든 경기 결과에는 모순이 없습니다.
입출력 예
nresultsreturn
5 | [[4, 3], [4, 2], [3, 2], [1, 2], [2, 5]] | 2 |
입출력 예 설명
2번 선수는 [1, 3, 4] 선수에게 패배했고 5번 선수에게 승리했기 때문에 4위입니다.
5번 선수는 4위인 2번 선수에게 패배했기 때문에 5위입니다.
- 문제 풀이 방법
문제 이해 :
그래프로 놓고 봤을때 각 선수 노드들의 간선들은 단방향으로 되어있고
A선수가 B선수를 이겼을 경우 A선수는 B선수가 이긴 선수의 대해 이겼다고도 판단할수있다.
각경기의 수 중에 가장 많이 경기를 한 사람들의 수를 구한다.
문제 요구사항 :
A선수가 B선수보다 실력이 좋다면 무조건 이긴다. A > B
몇몇경기 결과를 분실하였기 때문에 정확하게 순위를 매길수가없다.
정확하게 순위를 매길수있는 선수의 수를 찾는다.
문제 분석 :
1. 변수 선언
선수의 수 = n
각경기 수 = List
이긴 사람 = winner
진 사람 = loswer
선수 = Nodes (연결리스트,이긴사람 횟수,진사람 횟수, 해당 선수 방문 여부)
2. 변수들의 관계
이긴,진사람의 값은 List와 각경기수의 값을 나타낸다.
LinkedList는 이긴사람 기준으로 단방향으로 연결을 해준다.
문제 설계 :
노드 클래스를 선언하고 선수 번호,방문여부,이긴사람 카운트,진사람 카운트, 연결리스트 설정한다.
각 선수들의 값을 list에 담는다.
이긴사람을 담을 노드클래스를 생성하여 list안에 A번 인덱스 값을 통하여 값을 가져온다.
진사람을 담을 노드클래스를 생성하여 list안에 A번 인덱스 값을 통하여 값을 가져온다.
이긴사람 기준으로 진사람을 연결시킨다.
너비 탐색할 BFS 함수를 만든다.
이긴사람 방문처리 한다.
이긴사람 기준으로 큐에 넣는다.
이긴 사람 기준으로 진사람을 큐에담는다.
진사람을 이미 방문했으면 다시 방문하지않고 방문처리한다.
이긴사람 기준으로 진사람이 연결되어있을때 win + 1, lose + 1를 한다.
큐에 값이 없다면 각 노드의 win + lose하고 n - 1이 같을때 카운팅 해준다.
문제 구현 :
Nodes {
int n = 0;
boolean visit = false;
int win,los = 0;
List<Nodes> link = new LinkedList<>();
Nodes(int n) { this.n = n ; }
}
List<Nodes> list = new LinkedList<>();
for(int i = 1; i <= n; i++) { list.add(new Nodes(i));}
for(int[] res : ress) {
Nodes winner = list.get(res[0] - 1);
Nodes loswer = list.get(res[1] - 1);
winner.link.add(loswer);
int BFS() {
for(Nodes winner: list) {
Queue<Nodes> q = new LinkedList<>();
q.offer(winner);
while(!q.isEmpty()) {
Nodes now = q.poll();
for(Nodes loser: now.links) {
if(loser.visit) continue;
loser.visit = true;
winner .win += 1;
loswer .los+= 1;
}
}
}
}
'코딩테스트' 카테고리의 다른 글
[해커랭크] - 자바 기본 문제 1일차 (0) | 2022.06.03 |
---|---|
[프로그래머스] 비밀지도- JAVA (0) | 2022.05.20 |
[프로그래머스] 가장 먼 노드- JAVA (0) | 2022.05.15 |
[프로그래머스] 더 맵게- JAVA (0) | 2022.05.15 |
[프로그래머스] 게임 맵 최단거리- JAVA (0) | 2022.05.14 |