코테/프로그래머스

[프로그래머스/Lv. 3] N으로 표현 (JAVA)

imname1am 2023. 10. 6. 23:37
반응형

🔺 문제

 

프로그래머스

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

programmers.co.kr

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.*;
 
class Solution {
    public int solution(int N, int number) {
        List<Set<Integer>> setList = new ArrayList<>();
 
        for(int i = 0 ; i < 9 ; i++)    setList.add(new HashSet<>());    // 개수 별 HashSet 생성
        setList.get(1).add(N);  // 1은 본인만 만들 수 있음
        
        if(number == N)
            return 1;
        
        for(int i = 2 ; i < 9 ; i++) {
            for(int j = 1 ; j <= i / 2 ; j++) {
                unionSet(setList.get(i), setList.get(i - j), setList.get(j));
                unionSet(setList.get(i), setList.get(j),     setList.get(i - j));
            }
            
            // 연속된 숫자 넣기
            String str = Integer.toString(N);
            setList.get(i).add(Integer.parseInt(str.repeat(i)));  
            
            for(int num : setList.get(i)) {
                if(num == number)
                    return i;
            }
        }
        
        return -1;
    }
    
    // 두 Set의 값 간 사칙연산 계산 메소드
    private static void unionSet(Set<Integer> union, Set<Integer> a, Set<Integer> b) {
        for(int n1 : a) {
            for(int n2 : b) {
                union.add(n1 + n2);    union.add(n1 - n2);    union.add(n1 * n2);
                
                if(n2 != 0) union.add(n1 / n2);
            }
        }
    }
}
cs

 

 

🧩  해결 아이디어

• DP - Set을 활용한 메모이제이션

1) 숫자 N의 사용하는 갯수 별로 만들 수 있는 통 생성 (1~8까지)

2) 칸 숫자가 N인 경우, 합이 N이 되는 숫자 2개의 값 이용 (1+4 / 2+3 / 3 + 2 / 4 + 1 이런 식으로)

3) 각 통마다 연속된 숫자를 넣어줌 (Set 활용해 각 통마다 중복값 제거)

 

💥 유의사항

- 괄호 연산 때문에 양방향 다 계산해줘야하고, 연속된 숫자를 통마다 넣어줘야 한다.

- 통에 들어간 값은 중복되어서는 안 된다.

 


🔺 다른 풀이들

- Set 배열 활용, 연속수 넣는 방식 (* 10), 정답 얻는 방식(contains 활용) 이렇게 크게 총 3가지가 좀 다르다.

 

[동적계획법] N으로 표현 - Java 코드 ★★★(★★)

https://programmers.co.kr/learn/courses/30/lessons/42895?language=java 코딩테스트 연습 - N으로 표현 programmers.co.kr 문제 이해 DP는 메모이제이션이 필요하다. 해당 문제에서 이전단계에 대한 메모이제이션을 위해

bangu4.tistory.com

 

 

- 엥 DFS로 푸셨다ㅏ....  ㄴㅇㄱ

 

[알고리즘] 프로그래머스 - N으로 표현 - JAVA

https://programmers.co.kr/learn/courses/30/lessons/42895 코딩테스트 연습 - N으로 표현 programmers.co.kr 문제 설명 아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다. 12 = 5 + 5 + (5 / 5) + (5 / 5) 12 = 55 / 5 + 5 /

easybrother0103.tistory.com


💬 느낀 점

1시간 정도 고민해보고 풀었는데 못 풀었다...

Set 아이디어, 문자열로 생각해서 반복하는 아이디어는 혼자서 생각 못 했을 것 같다.

문제를 많이 안 풀었다는 것이겠지ㅎㅎ

분발하장,,,,

 

 

1회독 2회독 3회독 4회독 5회독
V        

(참고)

 

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

문제 링크 https://programmers.co.kr/learn/courses/30/lessons/42895 코딩테스트 연습 - N으로 표현 programmers.co.kr Dynamic Programming(동적 계획법)을 이용하여 풀었다. 풀이 방식 개인적으로 로직을 짜기 제일 까다

born2bedeveloper.tistory.com

 

https://velog.io/@doxxx93/programmers-pracice-42895

 

[프로그래머스] N으로 표현 - JAVA [자바]

[프로그래머스] N으로 표현 - JAVA [자바]

velog.io

 

반응형