import java.io.*;
import java.lang.*;
import java.util.*;
public class Main {
public static final Scanner scanner = new Scanner(System.in);
public static void testCase(int caseIndex) {
SudokuBoard board = new SudokuBoard();
int index = scanner.nextInt();
// 칸의 번호로 행, 열, 그룹 번호를 계산한다
int row = board.getRowByIndex(index);
int col = board.getColByIndex(index);
int group= board.getGroupByIndex(index);
// 정답을 출력한다
System.out.printf("Case #%d:\n", caseIndex);
System.out.printf("%d %d %d\n", row, col, group);
}
public static void main(String[] args) throws Exception {
int caseSize = scanner.nextInt();
for (int caseIndex = 1; caseIndex <= caseSize; caseIndex += 1) {
testCase(caseIndex);
}
}
}
class SudokuBoard{
static final int MAX_ROW = 9;
static final int MAX_COL = 9;
// 칸의 번호로 행의 번호를 계산하는 메소드
public int getRowByIndex(int index)
{
return ((index - 1) / 9) + 1;
}
// 칸의 번호로 열의 번호를 계산하는 메소드
public int getColByIndex(int index)
{
return ((index - 1) % 9) + 1;
}
// 칸의 번호로 그룹 번호를 계산하는 메소드
public int getGroupByIndex(int index)
{
int r = getRowByIndex(index);
int c = getColByIndex(index);
return getGroupByPosition(r, c);
}
// 칸의 위치 (행, 열)로 그룹 번호를 계산하는 메소드
public int getGroupByPosition(int row, int column)
{
int left = ((row - 1) / 3) * 3 + 1;
int offset = (column - 1) / 3;
return left + offset;
}
}
문제 풀이
- 행의 경우 ((주어진 숫자 - 1) % 9) + 1 / 열의 경우 ((주어진 숫자 - 1) / 9) + 1 로 구할 수 있었다
- 나머지 그룹을 구하는 부분은 많이 해맸다.
해맸던 부분
- 그룹을 구하는 부분이였다
- 총 9등분으로 나누어진 그룹을 구하기 위해서는 제일 왼쪽 즉 1, 4, 7번 그룹을 기준으로 (0 ~ 3 증감)을 통해 구할 수 있는 공식이 존재했다.
- 가장 왼쪽을 구하는 것은 행을 이용해서 구하면 된다. ((행 - 1) / 3) * 3 + 1
- 그리고 그룹의 증감 (0 ~ 3) = (열 - 1) / 3
'자료구조 & 알고리즘 관련 > 코딩테스트' 카테고리의 다른 글
최대공약수 최소공배수 (0) | 2022.12.24 |
---|---|
Probing (0) | 2022.12.22 |
세 카드 (0) | 2022.12.19 |
두 카드 (1) | 2022.12.16 |
팬미팅 (0) | 2022.12.15 |