-
프로그래머스 전력망을 둘로 나누기, 베스트앨범, 의상Java/코딩테스트 2023. 9. 26. 02:43
✂️프로그래머스 : 전력망을 둘로 나누기
https://school.programmers.co.kr/learn/courses/30/lessons/86971
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
✂️ 인접행렬로 그래프를 바꿔서 푸는 문제를 최근에 안 풀었어서 이번기회에 다시 풀어봤다. 역시 안 풀면 계속 머리가 굳는 것 같다..
✂️ 인접행렬로 그래프를 바꾸려면 아래 조건을 확인해봐야 한다.
- 노드 개수에 비해 에지가 적으면 효율성이 떨어지므로 비교해보기
- 노드 개수가 너무 많으면 메모리 초과날 수도 있음.
✂️ 이 문제에서는 에지 개수가 N-1이므로 첫 번째 조건을 충족
✂️ 노드 개수 또한 100개 이하이므로 두 번째 조건도 충족
✂️ 완전 탐색 문제인 만큼 그냥 선 하나 자르고 쭉 DFS 돌리는 방식으로 풀었다.
✂️ 코드
class Solution { int[][] graph; boolean[] visited; public int solution(int n, int[][] wires) { graph = new int[n+1][n+1]; visited = new boolean[n+1]; int answer = Integer.MAX_VALUE; for (int i = 0; i < wires.length; i++) { graph[wires[i][0]][wires[i][1]] = 1; graph[wires[i][1]][wires[i][0]] = 1; } for (int i = 0; i < wires.length; i++) { graph[wires[i][0]][wires[i][1]] = 0; graph[wires[i][1]][wires[i][0]] = 0; DFS(wires[i][0]); int temp = 0; for (int j = 1; j <= n; j++) { if (visited[j]) { temp++; } } answer = Math.min (answer, Math.abs(n - temp * 2)); visited = new boolean[n+1]; graph[wires[i][0]][wires[i][1]] = 1; graph[wires[i][1]][wires[i][0]] = 1; } return answer; } public void DFS(int start) { if (visited[start]) { return; } visited[start] = true; for (int i = 1; i < graph[start].length; i++) { if (graph[start][i] == 1) { DFS(i); } } } }
🎵프로그래머스 : 베스트앨범
https://school.programmers.co.kr/learn/courses/30/lessons/42579
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🎵어차피 각 장르 당 곡은 2개씩밖에 못 실어서, 그냥 용도별로 해시맵을 나눠서 다소 무식하게 ? 풀었다.
🎵 count 맵은 각 장르별 총 재생횟수 계산을 위한 해시맵, 재생횟수(value)기준으로 역순정렬해서 앨범에 실으면 된다.
🎵 맵 value기준으로 정렬하는거 코드 어떻게 외워서 침?? 진짜 복잡해서 머리에 잘 안들어온다;;
🎵 first, second는 각 장르별 제일 많이 재생된 애들, 2번째로 많이 재생된 애들 담는 용도이다. 얘네 갱신하느라 코드가 복잡해졌다.
🎵 참고로, 처음에 테스트 케이스 2,15만 틀리길래 왜그런가 했는데 장르 내 동일 재생횟수면 번호 작은게 우선순위다.
🎵 어차피 순서대로 읽으므로, 동일 값이 나오면 나중에 읽은 음악보다 먼저 읽은 음악이 고유번호가 낮아서 우선순위를 갖는다.
🎵 전체 코드
import java.util.*; class Solution { public int[] solution(String[] genres, int[] plays) { Map<String, Integer> count = new HashMap<>(); Map<String, Music> first = new HashMap<>(); Map<String, Music> second = new HashMap<>(); List<Integer> answer = new ArrayList<>(); for (int i = 0; i < plays.length; i++) { if (count.containsKey(genres[i])) { count.put(genres[i], count.get(genres[i]) + plays[i]); } else { count.put(genres[i], plays[i]); } int tempFirst = -1; int tempSecond = -1; if (first.containsKey(genres[i])) { tempFirst = first.get(genres[i]).plays; } if (second.containsKey(genres[i])) { tempSecond = second.get(genres[i]).plays; } if (tempFirst == -1 && tempSecond == -1) { // 둘다 비어있는 경우 first.put(genres[i], new Music(i, plays[i])); } else if (tempFirst != -1 && tempSecond == -1) { // 두 번째만 비어있는 경우 if (tempFirst > plays[i]) { // 첫 번째거가 더 크면 2번째에 그냥 넣기. second.put(genres[i], new Music(i, plays[i])); } else { // 첫 번째꺼를 second로 민다. second.put(genres[i], first.get(genres[i])); first.put(genres[i], new Music(i, plays[i])); } } else { // 둘다 값이 있어서 비교 필요 if (tempFirst >= plays[i]) { if (tempSecond < plays[i]) { // 같을 경우엔 어차피 나중에 읽은게 뒤 순위를 가지므로.. second.put(genres[i] , new Music(i, plays[i])); } } else { second.put(genres[i], first.get(genres[i])); first.put(genres[i], new Music(i, plays[i])); } } } List<Map.Entry<String, Integer>> entries = new LinkedList<>(count.entrySet()); entries.sort(Map.Entry.comparingByValue(Collections.reverseOrder())); for (Map.Entry<String, Integer> entry : entries) { String key = entry.getKey(); if (second.containsKey(key)) { answer.add(first.get(key).id); answer.add(second.get(key).id); } else { answer.add(first.get(key).id); } } return answer.stream().mapToInt(Integer::intValue).toArray(); } class Music { int id; int plays; public Music (int id, int plays) { this.id = id; this.plays = plays; } } }
🎀 프로그래머스 : 의상
https://school.programmers.co.kr/learn/courses/30/lessons/42578
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🎀 종류 + 해당하는 의상 개수를 HashMap에 저장한다.
🎀 조합을 구할 때 모자를 빼놓고 한다던가, 안경을 안 쓴다던가 하는 식으로 모든 종류의 옷을 입을 필요는 없다.
🎀 따라서, 안 입는 경우를 더해서 조합을 구한 후, 아무것도 걸치지 않은 상태 1을 빼주면 정답이 된다.
🎀 전체 코드
import java.util.*; class Solution { public int solution(String[][] clothes) { int answer = 1; Map<String, Integer> closet = new HashMap<>(); for (int i = 0; i < clothes.length; i++) { if (closet.containsKey(clothes[i][1])) { closet.put(clothes[i][1], closet.get(clothes[i][1]) + 1); } else { closet.put(clothes[i][1], 1); } } List<Integer> count = new ArrayList<>(closet.values()); for (int i = 0; i < count.size(); i++) { answer *= (count.get(i) + 1); } return (answer - 1); } }
'Java > 코딩테스트' 카테고리의 다른 글
백준 20056 (0) 2023.10.10 프로그래머스 프로세스, 퍼즐조각 채우기, 올바른 괄호 (0) 2023.10.03 백준 2133, 2141 (0) 2023.09.20 프로그래머스 시험장 나누기, 백준 21610 (0) 2023.09.19 백준 2636, 1339, 2110 (0) 2023.09.05