우당탕탕 개발일지

[프로그래머스] 가장 많이 받은 선물(Java, Level.1) 본문

코테/프로그래머스

[프로그래머스] 가장 많이 받은 선물(Java, Level.1)

ujin302 2024. 7. 5. 15:28
반응형

문제

조건 1. 이 전에 두 사람이 선물을 주고 받은 기록이 있다.

A -> B : 5

B -> A : 3 

A가 선물을 받는다. 

 

조건 2. 이 전에 두 사람이 선물을 주고 받은 기록이 없다. 

선물지수가 더 큰 사람이 받는다. 

단, 선물지수도 동일하다면 선물을 받지 않는다. 

 

조건 3. 이 전에 두 사람이 선물을 주고 받은 개수가 동일하다. 

선물지수가 더 큰 사람이 받는다. 

단, 선물지수도 동일하다면 선물을 받지 않는다. 

 

입출력 예

 

 

풀이

1. friend의 각 Index 번호를 HashMap에 저장하기 

해당 문제는 각 사람별 선물 관련 개수를 알기 위해 friend의 식별번호가 필요하다. 

그래서 처음에 주어진 friends의 Index 번호를 사용하여 문제를 해결하는 것이 좋다고 판단하였다. 

 

Key 값은 사람 이름, Value는 friend 배열에서 위치하고 있는 Index 번호를 저장하였다. 

해당 Index 값을 가지고 추후에 계속 사용한다. 

 

2. 선물 주고받은 개수 설정 

 

프로그래머스에서 표현해놓은 표처럼 2차원 배열, giftArr에 값 저장한다. 

1번에서 저장한 Index값을 2차원 배열 giftArr에서도 동일하게 사용한다. 

 

주어진 gifts 배열의 각 원소에서 선물 준 사람과 받은 사람을 구한다.

각각의 식별번호를 사용하여 giftArr[준 사람 식별번호][받은 사람 식별번호]의 값을 +1한다. 

 

3. 선물 지수 설정

 

2번에서 저장한 giftArr 배열을 활용하여 선물 지수를 설정한다. 

giftArr 배열의 가로의 값을 모두 더하면 선물 준 개수를 구할 수 있다.

또한 세로의 값을 모두 더하면 받은 선물의 개수를 구할 수 있다. 

 

선물 지수는 준 선물 개수 - 받은 선물 임으로 giftPoint 배열에 선물 지수 값을 저장한다.

 

4. 결과값 구하기 

 

이중 for문을 통해서 결과값을 구한다. 

두번째 for문을 보면 i값부터 시작한다.

그 이유는 0부터 시작하게 되면 이미 계산한 값을 한번 더 계산하기 때문이다. 

 

여기에 나와 있는 if문의 조건은 위의 문제 설명에 작성되어 있던 조건이다. 

 

조건 1. 이 전에 두 사람이 선물을 주고 받은 기록이 있다.

A -> B : 5

B -> A : 3 

A가 선물을 받는다. 

 

조건 2. 이 전에 두 사람이 선물을 주고 받은 기록이 없다. 

선물지수가 더 큰 사람이 받는다. 

단, 선물지수도 동일하다면 선물을 받지 않는다. 

 

조건 3. 이 전에 두 사람이 선물을 주고 받은 개수가 동일하다. 

선물지수가 더 큰 사람이 받는다. 

단, 선물지수도 동일하다면 선물을 받지 않는다. 

 

[첫번째 if문의 참]

해당 조건문을 만족하게 되면 조건 1에 만족하는 상황이다. 

조건 1

>> giftArr[i][j] != 0 || giftArr[j][i] != 0

 

조건 3에 해당하는 경우에는 선물지수로 판단하기에 선물개수가 동일하지 않은 경우에만 수행하게 조건을 걸었다. 

>> giftArr[i][j] != giftArr[j][i]

 

위의 조건을 만족하면 giftArr 배열을 통해 선물을 더 많이 준 사람을 판단한다. 

더 많이 준 사람은 선물을 1개 받게 되고 이를 result 배열에 저장한다. 

 

[첫번째 if문의 거짓]

else로 빠진 것은 조건 2, 조건 3를 만족한 상황이다. 

 

이 경우에는 선물지수가 더 높은 사람이 선물을 받게 된다. 

giftPoint배열에 저장되어 있는 값을 식별번호를 통해서 찾아 비교한다. 

선물 지수가 더 높은 사람이 선물을 1개 받게 되고 이를 result 배열에 저장한다. 

 

5. 반환값

4번에서 저장한 result 배열을 sort 함수를 통해 정렬한다. 

마지막 원소가 가장 큰 값이기에 해당 값 반환한다. 

 

 

코드

public int solution(String[] friends, String[] gifts) {
        int max = 0;
        int fCount = friends.length;
        int[][] giftArr = new int[fCount][fCount];
        HashMap<String, Integer> indexMap = new HashMap<String, Integer>();
        int[] giftPoint = new int[fCount];
        int[] result = new int[fCount];
        
        // 1. 사람별 index 설정 
        for(int i=0; i<fCount; i++) {
        	indexMap.put(friends[i], i);
        }
        
        // 2. 선물 주고받은 개수 설정 
        for(int i=0; i<gifts.length; i++) {
        	String a = gifts[i].split(" ")[0]; // 준 사람
           	String b = gifts[i].split(" ")[1]; // 받은 사람 
           	
           	int aIndex = indexMap.get(a);
           	int bIndex = indexMap.get(b);
           	
           	giftArr[aIndex][bIndex] ++;
        }
        
        // 3. 선물 지수 설정 
        for(int i=0; i<fCount; i++) {
        	// i번째가 준   선물 : [i][0~n] 합
        	// i번째가 받은 선물 : [0~n][i] 합
        	
        	int putSum = 0, getSum = 0; 
        	for(int j=0; j<fCount; j++) {
            	putSum += giftArr[i][j];
            	getSum += giftArr[j][i];
            }
        	giftPoint[i] = putSum - getSum;
        }
        
        // 4. 결과값 
        for(int i=0; i<fCount; i++) {
        	/* 1. 주고 받은 기록 O 
        	 * 더 많이 준 사람이 +1
        	 * 
        	 * 2. 주고 받은 기록 O && 주고 받은 수 동일 
             * 선물지수로 판단
        	*/
        	for(int j=i+1; j<fCount; j++) {
        		if((giftArr[i][j] != 0 || giftArr[j][i] != 0) && (giftArr[i][j] != giftArr[j][i])) {
        			// 1. 주고받음
        			if(giftArr[i][j] > giftArr[j][i]) {
        				result[i] ++;
        			}else if(giftArr[i][j] < giftArr[j][i]) {
        				result[j] ++;
        			}
        		}else {
        			// 2. 주고받지 않음 >> 선물 지수가 큰 사람이 받음 
        			if(giftPoint[i] > giftPoint[j]) {
        				result[i] ++;
        			}else if(giftPoint[i] < giftPoint[j]) {
        				result[j] ++;
        			}
        		}
            }
        	
        }
        
        Arrays.sort(result);
        max = result[fCount-1];
        return max;
    }

 

 

프로그래머스 문제

https://school.programmers.co.kr/learn/courses/30/lessons/258712

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형