1913: 달팽이
문제: https://www.acmicpc.net/problem/1913
N이 3일 때와 5일 때를 직접 그려보면 규칙성이 보인다.
해결 방법은 여러가지가 있겠지만, 나는 ↑, →, ↓, ← 를 하나의 사이클로 보고 해결하였다.
예를 들어 N = 5일 때
처음 시작하는 행과 열의 index는 2, 2이며 (0 Based)
첫 번째 사이클에서
↑ 1칸, → 1칸, ↓ 2칸, ← 2칸
두 번째 사이클에서
↑ 3칸, → 3칸, ↓ 4칸, ← 4칸
으로 움직이고 세 번째 사이클에서
↑ 4칸으로 가면서 끝나는 것으로 알 수 있다.
이것을 조금 일반화 하면 달팽이 배열의 끝은 항상 ↑에서 종료됨을 확인할 수 있기 때문에
↑ 반복문에서 달팽이 배열이 끝나는 지만 체크하면 된다.
소스 코드를 참고하세요. 소스 코드
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner standardInputScanner = new Scanner(System.in); int[][] matrix = new int[999][999]; int numOfInput = standardInputScanner.nextInt(); int findingCoordinate = standardInputScanner.nextInt(); standardInputScanner.close(); int rowIndex = numOfInput / 2; int colIndex = numOfInput / 2; int currentDepth = 1; int currentNumber = 1; matrix[rowIndex][colIndex] = currentNumber; boolean outFlag = false; for (;;) { for (int i = 0; i < currentDepth; ++i) { currentNumber++; matrix[--rowIndex][colIndex] = currentNumber; if (currentNumber == numOfInput * numOfInput) { outFlag = true; break; } } if (outFlag) { break; } for (int i = 0; i < currentDepth; ++i) { currentNumber++; matrix[rowIndex][++colIndex] = currentNumber; } currentDepth++; for (int i = 0; i < currentDepth; ++i) { currentNumber++; matrix[++rowIndex][colIndex] = currentNumber; } for (int i = 0; i < currentDepth; ++i) { currentNumber++; matrix[rowIndex][--colIndex] = currentNumber; } currentDepth++; } int indexOfRow = 0; int indexOfCol = 0; for (int i = 0; i < numOfInput; ++i) { for (int j = 0; j < numOfInput; ++j) { if (matrix[i][j] == findingCoordinate) { indexOfRow = i + 1; indexOfCol = j + 1; } System.out.print(matrix[i][j] + " "); } System.out.println(); } System.out.println(indexOfRow + " " + indexOfCol); } } | cs |
댓글
이 글 공유하기
다른 글
-
C++11/14 관련 Problem solving tip
C++11/14 관련 Problem solving tip
2016.12.03 -
1076: 저항
1076: 저항
2015.11.05 -
8741: 이진수 합
8741: 이진수 합
2015.04.01 -
9094: 수학적 호기심
9094: 수학적 호기심
2015.03.31