[랜덤 마라톤] Sudoku 5(20098)

lhs's avatar
Nov 23, 2024
[랜덤 마라톤] Sudoku 5(20098)
notion image
notion image

1. 문제 풀이 아이디어

  • 파일을 입력받고, 그 파일을 스도쿠 정답으로 변환하여 문제를 해결한다.
  • 입력 파일은 모두 0으로 채워져 있으므로, 아무 정답이나 만들어서 문제를 해결하면 된다.

2. 나의 정답 코드

public class Main { private static int n; private static int[][] map; public static void main(String[] args) throws IOException { File inputFile = new File("05.in"); File outputFile = new File("05.out"); BufferedReader bufferedReader = new BufferedReader(new FileReader(inputFile)); BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(outputFile)); String line; n = Integer.parseInt(bufferedReader.readLine()); map = new int[n * n][n * n]; for (int i = 0; i < n * n; i++) { StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine()); for (int j = 0; j < n * n; j++) { map[i][j] = Integer.parseInt(stringTokenizer.nextToken()); } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { fillMap(i, j); } } for (int i = 0; i < n * n; i++) { for (int j = 0; j < n * n; j++) { bufferedWriter.write(map[i][j] + " "); } bufferedWriter.newLine(); } bufferedWriter.close(); bufferedReader.close(); } private static void fillMap(int x, int y) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { int si = y * n; int sj = (x * n + y * n) % (n * n); int cur = (i * n + j + 1 + x * n - 1) % (n * n) + 1; map[si + i][sj + (j + x) % n] = cur; } } } }

3. 정리

  • 05.in 파일에서 nmap 배열을 읽어 저장한다.
  • n * n 크기만큼 반복하여 fillMap 메서드를 사용해 map 배열을 채운다.
  • fillMap에서는 배열을 채울 때 각 작은 영역의 시작 위치 si, sj를 계산하고, 그 위치에서 숫자들을 순차적으로 넣는다.
 
Share article

LHS's Study Space