백준 1913(달팽이) - Python(파이썬) - 구현
반응형
예제 풀이
49 | 26 | 27 | 28 | 29 | 30 | 31 |
48 | 32 | |||||
47 | 33 | |||||
46 | 34 | |||||
45 | 35 | |||||
44 | 36 | |||||
43 | 42 | 41 | 40 | 39 | 38 | 37 |
입력 받은 길이 7은 문자 n이라고 가정하고
이렇게 네부분으로 나눌 수 있다. ( i : x축( → ), j ( : y축( ↓ ) )
1. 노란색 부분 : i 값은 일정 | j 값은 1씩 늘어남 | 49부터 시작해서 49 - 7(n) +1 = 43까지 줄어듬
2. 초록색 부분 : i 값은 1씩 늘어남 | j 값은 일정 | 43부터 시작해서 43-7(n)+1 = 37까지 줄어듬
3. 하늘색 부분 : i 값은 일정 | j 값은 1씩 줄어듬 | 37부터 시작해서 37 - 7(n) + 1 = 31까지 줄어듬
4. 보라색 부분 : i 값은 1씩 줄어듬 | j 값은 일정 | 31부터 시작해서 31 - 7(n) + 1= 26까지 줄어듬
49 | 26 | 27 | 28 | 29 | 30 | 31 |
48 | 25 | 32 | ||||
47 | 9 | 33 | ||||
46 | 1 | 34 | ||||
45 | 35 | |||||
44 | 36 | |||||
43 | 42 | 41 | 40 | 39 | 38 | 37 |
( 0,0 ) -> 7*7 = 49
( 1,1 ) -> 5*5 = 25
( 2,2 ) ->3*3 = 9
( 3,3 ) -> 1*1 = 1 의 점을 이용해서
규칙을 찾으면
7 + 0 * 2 = 7
5 + 1 * 2 = 7
3 + 2 * 2 = 7
1 + 3(n//2) * 2 = 7
이런식으로
( i,i ) 점에 n - 2xi = 길이이고 그 안에 숫자는 길이 x 길이 수이다 라고 알 수 있다.
풀이 방법
① 함수를 선언하여서 (X의 시작점 , Y의 시작점 , 시작점에서의 숫자, 길이 ) 를 입력 받도록 한다.
② 함수안에는 for 루프로 배열 안에 입력 받도록 하는데
1. Y의 시작점이 1씩 늘어나면서 시작점에서의 숫자가 1씩 줄어들도록
2. X의 시작점이 1씩 늘어나면서 시작점에서의 숫자가 1씩 줄어들도록
3. Y의 시작점이 1씩 줄어들면서 시작점에서의 숫자가 1씩 줄어들도록
4. X의 시작점이 1씩 줄어들면서 시작점에서의 숫자가 1씩 줄어들도록
③ for 루프로 0부터 시작해서 입력 받은 숫자 n//2 1씩 늘어나면서 위에 만든 함수를 실행한다.
④ 단, 가운데 점은 입력을 받지 못하므로 끝난 후에는 array에 입력할 수 있도록 한다
⑤ 그 후에는 array를 출력하면서 찾는 숫자가 있는 지 확인한다.
* 참고
index는 숫자가 없는 경우 오류가 생기기 때문에 if __ in 을 사용해서 안에 있는지 확인한 후에 index를 사용한다.
Python(파이썬)
import sys
n = int(sys.stdin.readline())
findnum = int(sys.stdin.readline())
array=[['']*n for _ in range(n) ]
def func1(startX,startY,n,len):
#1. 노란색 부분
for i in range(len-1):
array[startY][startX] = n
startY = startY+1
n = n-1
#2. 초록색 부분
for i in range(len-1):
array[startY][startX]=n
startX = startX+1
n = n-1
#3. 하늘색 부분
for i in range(len-1):
array[startY][startX]=n
startY = startY-1
n = n-1
#4. 보라색 부분
for i in range(len-1):
array[startY][startX]=n
startX = startX -1
n = n-1
# array 안에 집어 넣기 ( 0,0 ) 점에 49 | (1,1) 점에 25 ...
for i in range(0,n//2,1):
num = n - i*2
func1(i,i,num*num,num)
#array 가운데의 점에는 안들어가므로 들어가도록 설정 ( range(0)이 성립이 안되므로 )
array[n//2][n//2]=1
#j=0부터 시작해서 한줄씩 실행
for j in range(len(array)):
#array[0]에 있는 값들을 출력
print(*array[j])
#만약 array[i]에 찾는 숫자가 있을 경우 찾도록
if findnum in array[j]:
arrayY = j+1
arrayX = array[j].index(findnum)+1
print(arrayY,arrayX)
Java(자바)
import java.util.*;
import java.io.*;
public class Main {
static int[][] array;
static void func(int startX,int startY, int n , int len){
for(int i=0;i<len-1;i++){
array[startY][startX]=n;
startY++;
n--;
}
for(int i=0;i<len-1;i++){
array[startY][startX]=n;
startX++;
n--;
}
for(int i=0;i<len-1;i++){
array[startY][startX]=n;
startY--;
n--;
}
for(int i=0;i<len-1;i++){
array[startY][startX]=n;
startX--;
n--;
}
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int findnum = Integer.parseInt(br.readLine());
array = new int[n][n];
for(int i=0;i<n/2;i++){
int num = n - i*2;
func(i,i,num*num,num);
}
array[n/2][n/2]=1;
int arrayX=0,arrayY =0;
for(int j=0;j<array.length;j++){
for(int i=0;i<array[0].length;i++){
if(findnum==array[j][i]){
arrayX= i+1;
arrayY = j+1;
}
sb.append(array[j][i]).append(" ");
}
sb.append("\n");
}
sb.append(arrayY).append(" ").append(arrayX);
System.out.print(sb);
}
}
반응형
'[백준] Python,Java로 풀기📖 > 구현' 카테고리의 다른 글
백준 10819(차이를 최대로)- Python(파이썬),Java(자바) - 구현,브루트포스(Permutations,Combinations,백트래킹,Java- 스택 사용 ) (0) | 2022.06.09 |
---|---|
백준 2232(지뢰) - 구현 (0) | 2022.05.25 |