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 |