요즘 학교에서 하는 python 캠프를 수행하고 있는데요. 코드 트리라는 사이트에서 문제풀이 형식으로 진행하고 있습니다.
그중 꽤 난이도가 있어서 성취감이 있었던 문제를 가져왔습니다. 이번 캠프를 통해 파이썬을 처음 접해봐서 코드가 매우 깔끔하지 못합니다. 원래 Java 유저여서 자바처럼 풀려고 하는 습관이 남아있네요. 풀이 시작하겠습니다.
문제
N * N 크기의 격자 안에 각 칸마다 거울이 하나씩 들어 있습니다. 각 거울은 \나 /의 형태를 띄고있고, 격자 밖 4N개의 위치 중 특정 위치에서 레이저를 쏘았을 때, 거울에 튕기는 횟수를 구하는 프로그램을 작성해보세요.
입력 형식
첫 번째 줄에 N이 주어집니다.
두 번째 줄부터 N개의 줄에 걸쳐 맵의 정보가 주어집니다. 각 줄에는 각 행에 해당하는 정보가 공백 없이 주어집니다. 이는 /나 \ 문자로만 이루어져 있습니다.
그 다음 줄에는 레이저를 쏘는 위치 K가 주어집니다. K는 다음과 같이 위에서 아래 방향으로 1행 1열 칸으로 들어오는 곳을 1번으로 하여 시계 방향으로 돌며 가능한 시작 위치에 순서대로 번호를 붙여 4N 번을 마지막으로 했을 때의 번호들 중 하나의 값으로 주어집니다.
- 1 ≤ N ≤ 1,000
- 1 ≤ K ≤ 4N
출력 형식
주어진 위치를 잡아 레이저를 쐈을 때 거울에 튕기는 횟수를 출력합니다.
입출력 예제
예제 1
입력:
3
/\\
\\\
/\/
2
출력:
3
예제 설명
아래와 같이 2번 위치에서 시작하면 총 3번 튕기게 됩니다.

아주 흥미롭고 재밌는 문제입니다. 여러분도 꼭 풀어보시고 어려우시다면 코드를 참고해 주시기 바랍니다.
코드
# 0
# ^
# |
# v
# 3 <--> (/,\) <-->1
# ^
# |
# v
# 2
# 북 남 서 동
def dir_code23(inputLight): #23은 / 을 2번 3번꼭지점으로 생각하여 분류한 것 입니다.
if inputLight == 0: # 들어가는 방향
return 1 # 나가는방향이면서 다음 번 거울이 받는 방향
elif inputLight == 1:
return 0
elif inputLight == 2:
return 3
else:
return 2
def dir_code14(inputLight):
if inputLight == 0:
return 3
elif inputLight == 3:
return 0
elif inputLight == 1:
return 2
else:
return 1
def move(dir_now): # 반사돼 나오는 빛의 이동경로를 표시한 함수입니다.
if dir_now == 0:
return [1 ,0]
elif dir_now == 1:
return [0 ,-1]
elif dir_now == 2:
return [-1,0]
else:
return [0,1]
n = int(input())
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < n
array = [[0 for i in range(n)] for j in range(n)] #거울이 들어있는 배열
arrayLight = [[0 for i in range(n)] for j in range(n)] #반사된 빛이 들어있는 배열
lightstep = 0 #빛이 몇번 반사됐는지 나타냅니다.
for i in range(n):
mirror = input()
for j in range(n):
array[i][j] = mirror[j]
inLight = int(input())-1
start_dir = inLight // n # 들어갈 방향
start_num = inLight % n # 들어갈 방향에서의 번호
x , y = 0, 0 # 가로 세로
if start_dir == 0: # 위에서 진입할때
x = 0
y = start_num
elif start_dir == 1: # 오른쪽에서 진입할때
x = start_num
y = n - 1
elif start_dir == 2: # 아래에서 진입할때
x = n - 1
y = n - start_num -1
else:
x = n - start_num -1 #왼쪽에서 진입할때
y = 0
dir_now = start_dir
while True:
#일단 들어가면서 불을 킨다
lightstep += 1
arrayLight[x][y] = lightstep
if array[x][y] == "/":
dir_now = dir_code23(dir_now)
dx , dy = move(dir_now)
x += dx
y += dy
#print(dir_now,x , y )
else:
dir_now = dir_code14(dir_now)
dx , dy = move(dir_now)
x += dx
y += dy
#print(dir_now,x , y )
if in_range(x, y)!=True: #만약 빛이 범위 밖으로 빠져나왔다면 출력해줍니다.
#print("Break {0} {1}".format(x,y))
break
print(lightstep)
'Knowledge > Python' 카테고리의 다른 글
[백준] 2178번: 미로 탐색 Python 코드, BFS (6) | 2022.10.14 |
---|---|
[코드트리] 정수 사각형 최솟값의 최대 , python 문제 풀이 (6) | 2022.07.26 |
[코드트리] 두 방향 탈출 가능 여부 판별하기 , python 문제 풀이 (4) | 2022.07.25 |
[코드트리] 금 채굴하기 , python 문제 풀이 (8) | 2022.07.18 |
[코드트리] 가운데에서 시작하여 빙빙 돌기 ,python 문제 풀이 (4) | 2022.07.17 |