https://school.programmers.co.kr/learn/courses/30/lessons/92334
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
이 문제푸는데 2시간정도 걸렸는데, 프로그래머스를 처음 사용해봐서 시간이 더 걸린 것 같습니다.
프로그래머스 풀때는 항상
첫번째. 사용할 함수들 라이브러리 import 합니다.
ArrayList나 Array에 사용되는 - import java.uitl.*;
String.split ... 에 사용되는 - import java.io.*;
두번째. String 비교할시 == 를 사용하는 이유
java에서 == 는 같은 object인지 검사하는것
string.equals(string2); 는 문자열이 같은 내용인지 검사하는것
이문제를 푼 방식 리뷰
풀이 :
ArrayList<Node>[] 1차원 배열을 만들어서 id_list의 순서대로 muzi, frodo, apeach, neo 가 있다고 생각합니다.
report[4] 배열에서 "apeach muzi" 값을 가져왔다고 가정합니다.
answer값을 리턴할때 각 유저별로 처리결과 메일을 받은 횟수를 배열에 담아 answer로 리턴하는 것이므로
처리될려면 k번 이상되어야하므로
ArrayList<Node>[]를 suspect(피의자)를 기준으로하여 몇번 신고되었는지 확인하고 k번 이상 신고되었다면
해당 ArrayList<Node>[] 에 있는 모든 내용을 돌면서 해당 reporter의 index에 +=1 을 해주면 해결됩니다.
apeach가 muzi를 신고했다는 내용이므로
ArrayList<Node>[0]에는 Node(apeach, muzi)가 들어갑니다.
다른방식도 존재할 수 있는데
그나마 HashTable 방식이 생각납니다. 일단 ArrayList로 풀었습니다.
import java.util.*; import java.io.*; /* String 비교할떄 == 를 사용하지 않는 이유는 == 는 같은 object 인지 확인하는것임(같은 객체인지) */ class Solution { //1.해야할일 정리 //배열은 length static ArrayList<Node>[] reportsuspectarraylist; public int[] solution(String[] id_list, String[] report, int k) { // System.out.println(id_list.length); reportsuspectarraylist = new ArrayList[id_list.length]; for(int i=0;i<id_list.length;i++){ reportsuspectarraylist[i] = new ArrayList<Node>(); } //신고받은 report 배열을 돌면서 reporter(신고자)와 suspect(신고당한자)로 나눈뒤 //유저ID의 인덱스를 찾은뒤 해당 인덱스 arraylist<Node> 1차원배열에 연결시킵니다. //연결시키는 과정에서 이전에 신고자,신고당한자와 for(int i=0;i<report.length;i++){ String[] report_split = report[i].split(" "); String reporter = report_split[0]; String suspect = report_split[1]; Node node = new Node(reporter, suspect); for(int j=0;j<id_list.length;j++){ String id_temp = id_list[j]; //arraylist순서는 id_list 순서와 같다. // System.out.println("id_temp, suspect: " + id_temp + " " + suspect); if(id_temp.equals(suspect)){ // System.out.println("it's same!"); boolean sameflag = false; for(int h=0;h<reportsuspectarraylist[j].size();h++){ //만약 신고자 중에 두번째신고라면 sameflag = true( 이미 신고완료한 상태라는 것을 나타냄 ) 로 변환합니다. if(reporter.equals(reportsuspectarraylist[j].get(h).reporter)){ sameflag = true; break; } } //reporter가 이전에 같은 사람을 신고한 전적이 없다면 if(sameflag == false){ reportsuspectarraylist[j].add(node); } } } } // print(id_list); // System.out.println("what??"); // for(int i=0;i<reportsuspectarraylist.length;i++){ // for(int j=0;j<reportsuspectarraylist[i].size();j++){ // System.out.println(" reporter: "+reportsuspectarraylist[i].get(j).reporter + " suspect :" +reportsuspectarraylist[i].get(j).suspect); // } // System.out.println(); // } // System.out.println("what??"); int[] answer = new int[id_list.length]; for(int i=0;i<reportsuspectarraylist.length;i++){ if( k <= reportsuspectarraylist[i].size() ){ for(int j=0;j<reportsuspectarraylist[i].size();j++){ for(int h=0;h<id_list.length;h++){ if(id_list[h].equals(reportsuspectarraylist[i].get(j).reporter)){ answer[h] += 1; } } } } } // int[] answer = {}; return answer; } class Node{ String reporter; String suspect; public Node(){ } public Node(String reporter, String suspect){ this.reporter = reporter; this.suspect = suspect; } } public void print(String[] arr){ for(int i=0;i<arr.length;i++){ System.out.println(" "+arr[i]); } } }
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[카카오 기출 문제] 괄호 변환 - 레벨 2,구현 + 문자열 (0) | 2022.10.05 |
---|---|
[카카오 기출 문제] 크레인 인형뽑기 - 레벨 1, 구현 (0) | 2022.09.05 |
[카카오 기출 문제] 키패드 누르기 - 레벨 1, 구현 + 문자열 (0) | 2022.09.05 |
[카카오 기출 문제] 숫자 문자열과 영단어 - 레벨 1, 구현 + 문자열 (0) | 2022.09.04 |
[카카오 기출 문제] 신규 아이디 추천 - 레벨 1, 구현 + 문자열 (0) | 2022.09.04 |