[코드트리 조별과제] HashMap 활용

2024. 7. 18. 14:30·CodeTree

코드트리에 HashMap을 활용하는 문제에서 임의의 두 수의 합을 구하는 문제가 있다.

 

수가 중복해서 나올 수 있는점을 고려해야 하기에 문제가 까다롭지만, HashMap을 사용하면 상수시간에 가까운 시간복잡도로 문제를 해결할 수 있다.

 

HashMap을 굳이 안쓰고 문제를 접근할 수도 있다 (투포인터, 합이 0에 가까운 또다른 수 찾기 (이분탐색))

 

하지만 숫자가 매우 큰경우에는 일반적인 배열의 인덱스로 활용하기 힘들기에 해싱 자료구조를 채택하는것이 좋다.

 

문제중에 두 수의 합과 세 수의 합이 있는데, 초안으로는 이분탐색과 투포인터로 해결할 실마리가 보였지만 반례에 막혔고

 

중복된 수에 대한 경우의수 예외를 적절하게 처리해주면 된다.

 

이를 위해 미리 수에 대한 카운팅 Map을 만들어주고

 

현재 소모할 숫자를 기준으로 경우를 세어주면 2개를 통해 k를 만드는 경우의 수를 구할 수 있다.

 

세 수의 합은 두수의 합에서 숫자하나만 고정시켜놓고, 그 밖의 범위에서 나머지 숫자를 찾으면 된다.

 

즉, 고정시킬 인덱스가  i 이고, 뽑을 두 수가 j, k일 때 자연수 i, j, k (i, j, k < arr.length )에서 찾아야할 수 find를 찾는 방법은

 

i < j < k 이면서 arr[i] + arr[j] + arr[k] = find 인 경우를 세어주면 된다.

 

import java.util.*;
import java.io.*;
public class Main {
    static int n;
    static int k;
    static int [] arr;
    static StringTokenizer stk;
    public static void main(String[] args) throws Exception{
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        stk = new StringTokenizer(bf.readLine());
        n = Integer.parseInt(stk.nextToken());
        k = Integer.parseInt(stk.nextToken());
        
        stk = new StringTokenizer(bf.readLine());
        arr = new int[n];
        for(int i= 0;i<n;i++){
            arr[i] = Integer.parseInt(stk.nextToken());
        }
        int cnt = 0;
        for(int i= 0;i<n-2;i++){
            // 수 하나 고정시켜놓고
            // 나머지 수들 중에서 2개를 뽑는 조합을 찾는다.
            // 이 때 고정수 기준으로 매번 새로운 조합인것을 연산에서 잊으면 안된다.
            HashMap<Integer, Integer> map = new HashMap<>();

            // 아래는 두수의 합이 k - arr[i] 만큼이 되는 경우를 뽑는것
            int find = k - arr[i];
            for(int j= i+1;j<n;j++){
                map.put(arr[j], map.get(arr[j]) == null ? 1 : map.get(arr[j]) + 1);
            }
            
            for(int j = i+1;j<n;j++){
                map.put(arr[j], map.get(arr[j])-1);
                if(map.containsKey(find - arr[j])){
                    cnt += map.get(find - arr[j]);
                }
            }
        }
        System.out.println(cnt);
    }
    
}

'CodeTree' 카테고리의 다른 글

[코드트리 조별과제] Grid Compression  (0) 2024.08.18
[코드트리 조별과제] 2차원 배열에서 한칸씩 이동하는 dp  (0) 2024.08.09
[코드트리 조별과제] 정렬을 다루는 자료구조 in Java  (0) 2024.07.29
[코드트리 조별과제] HashSet 활용  (1) 2024.07.24
'CodeTree' 카테고리의 다른 글
  • [코드트리 조별과제] Grid Compression
  • [코드트리 조별과제] 2차원 배열에서 한칸씩 이동하는 dp
  • [코드트리 조별과제] 정렬을 다루는 자료구조 in Java
  • [코드트리 조별과제] HashSet 활용
devKhc
devKhc
  • devKhc
    개발저장소 by 회창
    devKhc
  • 전체
    오늘
    어제
    • 분류 전체보기 (24)
      • Web-Spring (7)
      • CS (5)
      • Infra (3)
      • DB (1)
      • Java (3)
      • CodeTree (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JsonTypeInfo
    Springsecurity
    springboot #jenkins #CI/CD #Docker #EC2
    모드비트
    다중 코어 시스템
    set-cookie
    Multi-Processor
    SpringBoot
    defaultoauth2authorizationrequestresolver
    인터럽트
    코딩테스트
    코드트리조별과제
    이중모드와 다중모드
    samesite=none
    try with resources
    JsonSubTypes
    운영체제
    인터럽트 #운영체제 #공룡책
    코드트리
    Nginx #proxy #리버스 프록시
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
devKhc
[코드트리 조별과제] HashMap 활용

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.