HashMap 코테에서 활용하기

Dayon·2025년 9월 12일
1

코딩테스트

목록 보기
5/5
post-thumbnail

문제

📌 문제 요약

  • 사람마다 이름(name)그리움 점수(yearning) 가 주어진다.
  • 여러 장의 사진(photo)이 있으며, 각 사진에는 여러 사람의 이름이 담겨 있다.
  • 사진 속 등장하는 인물들의 그리움 점수 합계를 구해, 각 사진별 점수를 배열에 담아 반환하라.

📌 입력

  • name: 문자열 배열 (그리워하는 사람 이름)
  • yearning: 정수 배열 (각 사람의 그리움 점수)
  • photo: 2차원 문자열 배열 (사진 속 인물들 이름)

📌 출력

  • int[] : 각 사진별 추억 점수의 합

📌 제한사항

  • 3 ≤ name.length = yearning.length ≤ 100
  • 1 ≤ yearning[i] ≤ 100
  • 3 ≤ photo.length ≤ 100
  • 1 ≤ photo[i].length ≤ 100
  • namephoto[i]의 원소는 중복 없음

내가 쓴 코드

class Solution {
    public int[] solution(String[] name, int[] yearning, String[][] photo) {

        int[] answer = new int[photo.length];
        
        for(int i = 0 ; i < photo.length ; i++ ) {
            int sum = 0 ; 
            for(int j = 0 ; j < photo[i].length ; j++ ) {
                for(int n = 0 ; n < name.length ; n++ ) {
                    // 이름이 존재한다면 
                    if (photo[i][j].equals(name[n])) {
                        sum += yearning[n] ;
                    }
                }
            }
            answer[i] = sum ; 
        }
        return answer;
    }
}

✅ 시간 복잡도 / 효율성 전략

1. 직접 비교 방식 (삼중 for문)

for (photo[i][j]) {
    for (name[n]) {
        if (photo[i][j].equals(name[n])) {
            sum += yearning[n];
        }
    }
}
  • 시간 복잡도:
    • photo 최대 100개
    • 각 사진 최대 100명
    • name 최대 100명 → O(photo × photo[i] × name) = O(100 × 100 × 100) = 1,000,000 (백만 연산)
  • 충분히 실행 가능하지만, 불필요하게 중첩 루프가 깊음

2. HashMap 이용 방식 (최적화)

import java.util.*;

class Solution {
    public int[] solution(String[] name, int[] yearning, String[][] photo) {
        // 이름 → 그리움 점수 매핑
        Map<String, Integer> scoreMap = new HashMap<>();
        for (int i = 0; i < name.length; i++) {
            scoreMap.put(name[i], yearning[i]);
        }

        int[] answer = new int[photo.length];

        for (int i = 0; i < photo.length; i++) {
            int sum = 0;
            for (String person : photo[i]) {
                // 이름이 존재하면 점수 더하기
                sum += scoreMap.getOrDefault(person, 0);
            }
            answer[i] = sum;
        }

        return answer;
    }
}
  • 시간 복잡도:
    • Map 생성: O(name.length) = O(100)
    • 사진 순회: O(photo × photo[i]) = O(100 × 100) = 10,000 → 전체 O(10,000)
  • 백만 연산 대비 100배 이상 빠름
  • 실무/코테 모두에서 가장 효율적인 풀이 전략.

이름 → 그리움 점수 매핑을 HashMap에 미리 저장해두고, 조회할 때 O(1)로 가져오는 방식이 좋을 것 같다.


🎀 메모

  • 문자열 비교는 equals를 사용한다. photo[i][j].equals(name[n])
  • HashMap은 Key→ Value 구조라서 O(1)에 조회 가능
    • 1:1 매핑 관계가 필요할때 사용하자
    • 중복 카운트 / 빈도수를 셀때 사용하자 → map.put(x, map.getOrDefault(x, 0) + 1) 패턴 자주 사용
  • HashMap 문법
    • 값 넣기 : map.put("may", 5);

    • 값 가져오기 : int score = map.get("may");

    • 값 업데이트 : map.put("may", map.getOrDefault("may", 0) + 1);

    • 존재 여부 확인 :

      if (map.containsKey("may")) {
          System.out.println("있음"); 
      }
profile
success is within reach, allow yourself time

0개의 댓글