Java - [프로그래머스]42895-N으로 표현

Paek·2023년 8월 1일
0

코테공부 자바

목록 보기
3/25
post-custom-banner

파이썬으로 한번 해결했던 문제지만 최근 자바로 언어를 바꾸어서 자바로 다시 해결하였습니다. 파이썬으로 풀때랑 많이 다른 느낌을 받았습니다.

문제

N를 가지고 사칙연산을 수행하여 원하는 숫자를 표현하는 방법 중 N 사용 횟수의 최솟값을 구하는 문제입니다.

접근 방법

자세한 풀이는 이전 파이썬을 이용한 해결법 을 읽어보시면 좋을 것 같습니다. 저는 이번 글에서는 풀이내용 보다는 제가 새로이 알게 된 내용을 매우 간단하게만 정리해보려고 합니다.

자바에서 '집합'을 사용하기 위해 HashSet을 사용하였고, 메서드와 선언 방법을 알아보기 위해 참고한 좋은 블로그가 있었습니다.

새로 알게된 것은 자바는 Set를 지원하였고, 다양한 메서드가 있어 활용하게 되었습니다.

Set의 가장 큰 특징이라 하면 크게 두 가지가 있습니다. 첫 번째로 '데이터를 중복해서 저장할 수 없음'입니다. 두 번째는 '입력 순서대로의 저장 순서를 보장하지 않는다'입니다. 다만 LinkedHashSet는 저장 순서를 보장한다고 합니다.

Set.add()와 Set.contains()를 사용하여 문제를 해결할 수 있었습니다.

코드

import java.util.*;
class Solution {
    public int solution(int N, int number) {
        Set<Integer>[] set = new Set[9];
        int tmp = N;
        for(int i = 1; i < 9; i++) {
            set[i] = new HashSet<Integer>();
            set[i].add(tmp);
            tmp = tmp*10 + N;
        }
        for(int i = 1; i < 9; i++) {
            for(int j = 1;j < i; j++ ) {
                for(Integer x : set[j]) {
                    for(Integer y : set[i-j]) {
                        set[i].add(x+y);
                        set[i].add(x-y);
                        set[i].add(y-x);
                        set[i].add(x*y);
                        if(x != 0) set[i].add(y/x);
                        if(y != 0) set[i].add(x/y);
                    }
                }
            }
        }
        for(int i = 1; i < 9; i++) {
            if(set[i].contains(number)) {
                return i;
            }
        }
        return -1;
    }
}
profile
티스토리로 이전했습니다. https://100cblog.tistory.com/
post-custom-banner

0개의 댓글