[JAVA] [LEVEL1] 프로그래머스 - 숫자 짝꿍

반응형

프로그래머스 programmers Level1 숫자 짝꿍 - java 자바

[문제]

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

 

프로그래머스

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

programmers.co.kr

 

[풀이]

제한 사항을 보면 다음과 같다.

  • 3 ≤  X ,  Y 의 길이(자릿수) ≤ 3,000,000입니다.
  •  X ,  Y 는 0으로 시작하지 않습니다.
  •  X ,  Y 의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

for문을 사용해서 자릿수 전체를 확인할 필요가 있어보이는데,  X ,  Y 의 길이가 최대 3,000,000 이므로 자칫 시간제한에 걸릴 위험이 커 보인다. 따라서 이 전에 풀었던 문제(완주하지 못한 선수)에서 사용했던 Map 의 getOrDefault() 메소드가 떠올랐고 그것을 사용하면 해볼만 하다고 생각했다.

 

  1.  X  Y 의 각각 자리수를 담을 HashMap을 선언한다.
    → xMapyMap
  2. 문자열  X 의 자리수를 확인한다
    2.1. 문자열  X 를 자리수로 잘라 배열에 담는다
    2.2. key = 자리수, value = getOrDefault(key, 0) + 1
    ⇒ 중복되는 key가 있을 수 있으므로 getOrDefault(key, 0) + 1 로 value 설정
  3. 문자열  Y 의 자리수를 확인한다.
    3.1. 문자열  Y 를 자리수로 잘라 배열에 담는다.
    3.2. key = 자리수, value = getOrDefault(key, 0) +1
    ⇒ 중복되는 key가 있을 수 있으므로 getOrDefault(key, 0) + 1 로 value 설정
  4. xMapyMap을 확인하여 공통된 숫자를 얻어 리스트에 담아준다.
  5. 내림차순 정렬하여 가장 큰 정수로 결과를 반환한다.
    5.1. 리스트가 공백이면 공통된 숫자가 없으므로 -1 을 문자열로 리턴한다.
    5.2. 리스트에 0만 존재하면 0 을 문자열로 리턴한다.
    5.3. 이외의 경우 가장 큰 정수를 문자열로 리턴한다.

 

[java 코드]

import java.util.*;
import java.util.stream.*;

private final static String BLANK = "";

/**
 * 숫자 짝꿍
 * @param X
 * @param Y
 * @return X,Y 중 공통으로 나타나는 정수를 이용하여 가장 큰 정수, 공통수가 없으면 -1
 */
public String solution(String X, String Y) {
    String answer = "";
    Map<String, Integer> xMap = new HashMap<>();
    Map<String, Integer> yMap = new HashMap<>();

    // X 정수
    String[] splitX = X.split("");

    for (String sx : splitX) {
        xMap.put(sx, xMap.getOrDefault(sx, 0) + 1);
    }

    // Y 정수
    String[] splitY = Y.split("");
    for (String sy : splitY) {
        yMap.put(sy, yMap.getOrDefault(sy, 0) + 1);
    }

    List<String> result = new ArrayList<>();
    for (String xKey : xMap.keySet()) {
        // y 에 x 숫자가 존재하지 않는 경우
        if (!yMap.containsKey(xKey)) {
        continue;
    }
    // y 에 x 숫자가 존재하는 경우, 둘 다 있는 수만큼 넣어야 하므로 value 값이 작은 것으로 들어감
    int min = Math.min(xMap.get(xKey), yMap.get(xKey));
    for (int i = 0; i < min; i++) {
        result.add(xKey);
        }
    }
    // 내림차순 정렬하여 String 으로 변환
    answer = result.stream().sorted(Collections.reverseOrder()).collect(Collectors.joining());
    if (BLANK.equals(answer)) {
        answer = "-1";
    } else if (BLANK.equals(answer.replaceAll("0",""))) {
        // 0밖에 없는 경우
        answer = "0";
    }
    return answer;
}

 

반응형