개발/코딩

[프로그래밍] 프로그래머스 예제문제 풀어보기 <신고 결과 받기> (성공)

mabb 2022. 3. 13. 08:34
반응형

드디어 프로그래머스 신고결과받기 예제 성공!
아~ 삶의 질이 좋아졌다.

 지금까지 시간초과 문제로 골머리를 썼는데 잠을 자다가 문득 생각이 들었음

for문 안에서 HashMap이나 Set를 만든 것이 문제가 아닐까...

 for문 하나를 줄여보겠다고 나름 머리를 써본 것인데 반복 횟수가 커질 수록 for문 속에서
계속해서 import한 util을 사용하여 객체를 만드는 것이 부담될 것 같다는 생각이 들었음.
for문을 하나 더 쓰더라도 for문 속에서 객체를 만드는 것을 지양하는 방식으로 새롭게 코드를 작성해봄

자료형에 대해 많이 배우게 된 시간이었고 같은 문제라도 코딩하는 방식에 따라 결과가 천지차이라는 것을 알게 되었다.
어떻게 통과는 하였으나 분명 이 코드에도 문제점이 많을 것이라 생각한다.
프로그래머스에서는 answer를 구하기까지의 시간을 확인할 수 있으니 
내 코드가 효율적인 코드인가 테스트해보기 좋겠다는 생각을 했다.

java 배운 것)
▶ 배열을 Set로 바꾸는 방법  //  중복값을 없애기 위함
  Set<String> reportSet = new HashSet<String>(Arrays.asList(report));

String을 특정 문자를 기준으로 나누는 방법 // "muzi neo" 를 {"muzi","neo"}의 배열로 만들기 위함
  String reporter = reportRecord.split(" ")[0];
  String defendant = reportRecord.split(" ")[1]

▶HashMap 사용법 // key=Value 형태, key는 중복을 허용하지 않는 set형

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.*;
 
 
class Solution {
    public int[] solution(String[] id_list, String[] report, int k) {
        
        int[] answer = new int[id_list.length];        
        Set<String> reportSet = new HashSet<String>(Arrays.asList(report));
        ArrayList<String[]> reportArray = new ArrayList<String[]>();
        Map<String,Integer> idNumMap = new HashMap<>();
        
        for(int n =0; n<id_list.length; n++){
            idNumMap.put(id_list[n],n);
        }
                
        for(String reportRecord: reportSet){
            String reporter = reportRecord.split(" ")[0];
            String defendant = reportRecord.split(" ")[1];
            String[] recordArr = {reporter,defendant};
            reportArray.add(recordArr);
        }
        
        for(String member: id_list){
            int countReport = 0;
            for(String[] records: reportArray){
                  if(member.equals(records[1])){
                      countReport++;
                }
            }
        
            System.out.println(countReport);
            if(countReport >= k){
              
                   for(String[] records: reportArray){
                      if(member.equals(records[1])){
                        answer[idNumMap.get(records[0])]++;
                         }    
                     }
                  }
        }
        
        
     return answer;
            
        }             
    }
cs

■코드 -> 한글
1: 자바 유틸의 모든것(*)을 임포트한다
4-46: 솔루션 클래스
5: String배열 id_list와 report, int k를 인자로 받아서 int배열을 반환하는 솔루션 메서드
7: return 해줄 int배열 answer 를 id_list의 길이만한 크기로 만들어준다
8: 인자로 받은 report의 중복값을 제거하기 위하여 set형 reportSet으로 선언한다
9: reportSet을 담을 String배열을 받는 ArrayList reportArray를 선언한다. reportSet의 각각의 값은
" "스페이스 한 칸으로 구분되어있음. "신고자 피신고자" -> {"신고자","피신고자"} 배열로 넣기 위함
10: id_list의 각각의 id마다 index를 달아주기 위한 HashMap을 선언한다.
12-14: id_list에 인덱스를 달아주는 for문
16-21: reportSet을 {"신고자","피신고자"}의 배열로 reportArray에 담아주는 for문
23-40: id_list의 멤버를 하나씩 for문으로 꺼내어 반복작업을 수행한다.
24: 해당 멤버 member가 신고받은 횟수를 카운팅하기 위한 int 변수 countReport를 0으로 초기화하며 생성한다. 
25-29: 해당 멤버가 신고받은 사람이라면 countReport를 1더해주는 for문
31: 엥 안 지웠었네;; 이것때문에 속도가 조금 더 저하되었으려나;;
32-40: countReport가 k이상이면 실행하는 if문
34-39: 다시 reportArray를 for문으로 돌려 멤버가 피고인 경우를 확인한다.
35-37: 해당 멤버는 신고받은 건수가 k회 이상이므로 이번에는 해당 멤버를 신고한 사람에게 1을 더해준다.
아까 만들어둔 idNumMap을 통해 신고자 records[0]을 이용하여 인덱스를 구하고 이를이용하여 answer배열에서 신고한 사람에 해당하는 인덱스에 +1을 해준다.
43: 모든 반복문을 수행한 후 구해진 answer를 반환한다.

출처: 프로그래머스 채점결과/

31행에 테스트용으로 작성하였던 System.out.println(); 을 지우니 속도가 많이 빨라졌다!

<신고 결과 받기>  예제의 결과 정리

 

반응형