Skip to content

Commit 632a38b

Browse files
committed
[level 2] Title: 비밀 코드 해독, Time: 45.36 ms, Memory: 94.3 MB -BaekjoonHub
1 parent ce0a5e7 commit 632a38b

File tree

2 files changed

+248
-0
lines changed

2 files changed

+248
-0
lines changed
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
# [level 2] 비밀 코드 해독 - 388352
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/388352)
4+
5+
### 성능 요약
6+
7+
메모리: 94.3 MB, 시간: 45.36 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2025 프로그래머스 코드챌린지 1차 예선
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 11월 03일 19:54:29
20+
21+
### 문제 설명
22+
23+
<p>당신은 비밀 조직의 보안 시스템을 뚫고 중요한 정보를 해독해야 합니다. 시스템은 1부터 <code>n</code>까지의 서로 다른 정수 5개가 오름차순으로 정렬된 비밀 코드를 가지고 있으며, 당신은 이 비밀 코드를 맞혀야 합니다. </p>
24+
25+
<p>당신은 비밀 코드를 알아내기 위해 암호 분석 도구를 사용하며, <code>m</code>번의 시도를 할 수 있습니다. 각 시도마다 서로 다른 5개의 정수를 입력하면, 시스템은 그 중 몇 개가 비밀 코드에 포함되어 있는지 알려줍니다.</p>
26+
27+
<ul>
28+
<li>만약 비밀 코드가 [3, 5, 7, 9, 10]이고, 입력한 정수가 [1, 2, 3, 4, 5]라면 비밀 코드에 포함된 정수는 3, 5 두 개이므로 시스템은 2를 응답합니다.</li>
29+
</ul>
30+
31+
<p>당신은 <code>m</code>번의 시도 후, 비밀 코드로 가능한 정수 조합의 개수를 알고 싶습니다.</p>
32+
33+
<p>비밀 코드에 사용된 정수의 범위가 1~10일 때, 아래와 같이 5번의 시도를 했다고 가정해 보겠습니다.</p>
34+
<table class="table">
35+
<thead><tr>
36+
<th>입력한 정수</th>
37+
<th>시스템 응답(일치하는 개수)</th>
38+
</tr>
39+
</thead>
40+
<tbody><tr>
41+
<td>[1, 2, 3, 4, 5]</td>
42+
<td>2개</td>
43+
</tr>
44+
<tr>
45+
<td>[6, 7, 8, 9, 10]</td>
46+
<td>3개</td>
47+
</tr>
48+
<tr>
49+
<td>[3, 7, 8, 9, 10]</td>
50+
<td>4개</td>
51+
</tr>
52+
<tr>
53+
<td>[2, 5, 7, 9, 10]</td>
54+
<td>3개</td>
55+
</tr>
56+
<tr>
57+
<td>[3, 4, 5, 6, 7]</td>
58+
<td>3개</td>
59+
</tr>
60+
</tbody>
61+
</table>
62+
<p>비밀 코드로 가능한 정수 조합은 아래와 같이 3개가 있습니다.</p>
63+
64+
<ul>
65+
<li>[3, 4, 7, 9, 10]
66+
67+
<ul>
68+
<li>첫 번째 시도에서 비밀 코드에 포함된 정수가 3, 4로 2개 있습니다.</li>
69+
<li>두 번째 시도에서 비밀 코드에 포함된 정수가 7, 9, 10으로 3개 있습니다.</li>
70+
<li>세 번째 시도에서 비밀 코드에 포함된 정수가 3, 7, 9, 10으로 4개 있습니다.</li>
71+
<li>네 번째 시도에서 비밀 코드에 포함된 정수가 7, 9, 10으로 3개 있습니다.</li>
72+
<li>다섯 번째 시도에서 비밀 코드에 포함된 정수가 3, 4, 7로 3개 있습니다.</li>
73+
</ul></li>
74+
<li>[3, 5, 7, 8, 9]
75+
76+
<ul>
77+
<li>첫 번째 시도에서 비밀 코드에 포함된 정수가 3, 5로 2개 있습니다.</li>
78+
<li>두 번째 시도에서 비밀 코드에 포함된 정수가 7, 8, 9로 3개 있습니다.</li>
79+
<li>세 번째 시도에서 비밀 코드에 포함된 정수가 3, 7, 8, 9로 4개 있습니다.</li>
80+
<li>네 번째 시도에서 비밀 코드에 포함된 정수가 5, 7, 9로 3개 있습니다.</li>
81+
<li>다섯 번째 시도에서 비밀 코드에 포함된 정수가 3, 5, 7로 3개 있습니다.</li>
82+
</ul></li>
83+
<li>[3, 5, 7, 8, 10]
84+
85+
<ul>
86+
<li>첫 번째 시도에서 비밀 코드에 포함된 정수가 3, 5로 2개 있습니다.</li>
87+
<li>두 번째 시도에서 비밀 코드에 포함된 정수가 7, 8, 10으로 3개 있습니다.</li>
88+
<li>세 번째 시도에서 비밀 코드에 포함된 정수가 3, 7, 8, 10으로 4개 있습니다.</li>
89+
<li>네 번째 시도에서 비밀 코드에 포함된 정수가 5, 7, 10으로 3개 있습니다.</li>
90+
<li>다섯 번째 시도에서 비밀 코드에 포함된 정수가 3, 5, 7로 3개 있습니다.</li>
91+
</ul></li>
92+
</ul>
93+
94+
<p>정수 <code>n</code>, 입력한 정수를 담은 2차원 정수 배열 <code>q</code>와 시스템 응답을 담은 1차원 정수 배열 <code>ans</code>가 매개변수로 주어집니다. 이때, 비밀 코드로 가능한 정수 조합 개수를 return 하도록 solution 함수를 완성해 주세요.</p>
95+
96+
<hr>
97+
98+
<h5>제한사항</h5>
99+
100+
<ul>
101+
<li>10 ≤ <code>n</code> ≤ 30</li>
102+
<li>1 ≤ (<code>q</code>의 길이 = <code>m</code>) ≤ 10
103+
104+
<ul>
105+
<li><code>q[i]</code>의 길이 = 5</li>
106+
<li><code>q[i]</code>는 <code>i+1</code>번째 시도에서 입력한 5개의 서로 다른 정수를 담고 있으며, 오름차순으로 정렬되어 있습니다.</li>
107+
<li>1 ≤ <code>q[i][j]</code> ≤ <code>n</code></li>
108+
</ul></li>
109+
<li><code>ans</code>의 길이 = <code>m</code>
110+
111+
<ul>
112+
<li><code>ans[i]</code>는 <code>i+1</code>번째 시도에서 입력한 5개의 정수 중 비밀 코드에 포함된 정수의 개수를 나타냅니다.</li>
113+
<li>0 ≤ <code>ans[i]</code> ≤ 5</li>
114+
</ul></li>
115+
<li>비밀 코드가 존재하지 않는(답이 0인) 경우는 주어지지 않습니다.</li>
116+
</ul>
117+
118+
<hr>
119+
120+
<h5>테스트 케이스 구성 안내</h5>
121+
122+
<p>아래는 테스트 케이스 구성을 나타냅니다. 각 그룹 내의 테스트 케이스를 모두 통과하면 해당 그룹에 할당된 점수를 획득할 수 있습니다.</p>
123+
<table class="table">
124+
<thead><tr>
125+
<th>그룹</th>
126+
<th>총점</th>
127+
<th>추가 제한 사항</th>
128+
</tr>
129+
</thead>
130+
<tbody><tr>
131+
<td>#1</td>
132+
<td>20%</td>
133+
<td><code>m</code> = 1</td>
134+
</tr>
135+
<tr>
136+
<td>#2</td>
137+
<td>80%</td>
138+
<td>추가 제한 사항 없음</td>
139+
</tr>
140+
</tbody>
141+
</table>
142+
<hr>
143+
144+
<h5>입출력 예</h5>
145+
<table class="table">
146+
<thead><tr>
147+
<th>n</th>
148+
<th>q</th>
149+
<th>ans</th>
150+
<th>result</th>
151+
</tr>
152+
</thead>
153+
<tbody><tr>
154+
<td>10</td>
155+
<td>[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [3, 7, 8, 9, 10], [2, 5, 7, 9, 10], [3, 4, 5, 6, 7]]</td>
156+
<td>[2, 3, 4, 3, 3]</td>
157+
<td>3</td>
158+
</tr>
159+
<tr>
160+
<td>15</td>
161+
<td>[[2, 3, 9, 12, 13], [1, 4, 6, 7, 9], [1, 2, 8, 10, 12], [6, 7, 11, 13, 15], [1, 4, 10, 11, 14]]</td>
162+
<td>[2, 1, 3, 0, 1]</td>
163+
<td>5</td>
164+
</tr>
165+
</tbody>
166+
</table>
167+
<hr>
168+
169+
<h5>입출력 예 설명</h5>
170+
171+
<p><strong>입출력 예 #1</strong></p>
172+
173+
<p>문제 예시와 같습니다.</p>
174+
175+
<p><strong>입출력 예 #2</strong></p>
176+
177+
<p>비밀 코드로 가능한 정수 조합은 아래와 같이 5개가 있습니다.</p>
178+
179+
<ul>
180+
<li>[1, 2, 3, 5, 8]</li>
181+
<li>[1, 3, 5, 8, 12]</li>
182+
<li>[2, 4, 5, 8, 12]</li>
183+
<li>[2, 5, 8, 9, 10]</li>
184+
<li>[5, 8, 9, 10, 12]</li>
185+
</ul>
186+
187+
<p>따라서 5를 return 해야 합니다.</p>
188+
189+
190+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import java.util.*;
2+
3+
4+
class Solution {
5+
static int answer;
6+
public int solution(int n, int[][] q, int[] ans) {
7+
answer = 0;
8+
9+
for(int i =1; i<=n; i++) {
10+
List<Integer> list = new ArrayList<>();
11+
list.add(i);
12+
back(i, n,list, new boolean[n+1], q, ans);
13+
}
14+
15+
16+
return answer;
17+
}
18+
19+
static void back(int start, int size, List<Integer> list, boolean visited[], int [][] q, int [] ans) {
20+
21+
if(list.size() == 5) {
22+
if(check(list, q, ans)) {
23+
answer+=1;
24+
}
25+
26+
return;
27+
}
28+
29+
for(int i = start+1; i<=size; i++) {
30+
if(!visited[i]) {
31+
visited[i] = true;
32+
list.add(i);
33+
back(i, size, list, visited, q, ans);
34+
visited[i] = false;
35+
list.remove(list.size()-1);
36+
}
37+
}
38+
}
39+
40+
static boolean check(List<Integer> list, int q[][], int ans[]) {
41+
boolean check = true;
42+
43+
for(int i =0; i< q.length; i++) {
44+
int count = 0;
45+
for(int j =0; j< q[0].length; j++) {
46+
if(list.contains(q[i][j])) {
47+
count+=1;
48+
}
49+
}
50+
51+
if(count != ans[i]) {
52+
check= false;
53+
break;
54+
}
55+
}
56+
return check;
57+
}
58+
}

0 commit comments

Comments
 (0)