[백준/JAVA] 백트래킹 15649 N과 M(1)
2025. 1. 4. 18:05ㆍCoding Test/백준
나의 답) 틀림
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (i == j) continue;
else sb.append(i).append(" ").append(j).append(" ");
}
sb.append("\n");
}
System.out.print(sb);
}
}
입력:
N = 4, M = 2
의도한 출력:
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3
실제 출력:
1 2
2 1
3 1 3 2
4 1 4 2
틀린 이유
- 내부 for문이 j를 1부터 M까지 반복하므로 N = 4, M = 2에서 j의 범위가 제대로 설정되지 않았다.
- i == j 조건에서 j의 범위를 M으로 제한한 것이 의도한 순열을 방해했다.
수정된 답) 288ms
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] res = new int[m];
boolean[] visited = new boolean[n + 1];
backtrack(n, m, 0, res, visited, sb);
System.out.print(sb);
}
static void backtrack(int n, int m, int depth, int[] res, boolean[] visited, StringBuilder sb) {
if (depth == m) {
for (int i = 0; i < m; i++) {
sb.append(res[i]).append(" ");
}
sb.append("\n");
return;
}
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
visited[i] = true;
res[depth] = i;
backtrack(n, m, depth + 1, res, visited, sb);
visited[i] = false;
}
}
}
}
'Coding Test > 백준' 카테고리의 다른 글
[백준/JAVA] 해시를 사용한 집합과 맵 10815 숫자 카드 (0) | 2025.01.04 |
---|---|
[백준/JAVA] 해시를 사용한 집합과 맵 1764 듣보잡 (1) | 2025.01.03 |
[백준/JAVA] 해시를 사용한 집합과 맵 10816 숫자 카드 2 (0) | 2025.01.03 |
[백준/JAVA] 해시를 사용한 집합과 맵 1920 수 찾기 (0) | 2025.01.03 |
[JAVA] 백준 9단계 약수, 배수와 소수 (0) | 2024.11.30 |