문제
N * N 크기의 격자 안에 각 칸마다 거울이 하나씩 들어 있습니다. 각 거울은 \나 /의 형태를 띄고있고, 격자 밖 4N개의 위치 중 특정 위치에서 레이저를 쏘았을 때, 거울에 튕기는 횟수를 구하는 프로그램을 작성해보세요.
입력 형식
첫 번째 줄에 N이 주어집니다.
두 번째 줄부터 N개의 줄에 걸쳐 맵의 정보가 주어집니다. 각 줄에는 각 행에 해당하는 정보가 공백없이 주어집니다. 이는 /나 \ 문자로만 이루어져 있습니다.
그 다음 줄에는 레이저를 쏘는 위치 K가 주어집니다. K는 다음과 같이 위에서 아래 방향으로 1행 1열 칸으로 들어오는 곳을 1번으로 하여 시계 방향으로 돌며 가능한 시작 위치에 순서대로 번호를 붙여 4N 번을 마지막으로 했을 때의 번호들 중 하나의 값으로 주어집니다.
- 1 ≤ N ≤ 1,000
- 1 ≤ K ≤ 4N
출력 형식
주어진 위치를 잡아 레이저를 쐈을 때 거울에 튕기는 횟수를 출력합니다.
입출력 예제
예제1
입력:
3
/\\
\\\
/\/
2
출력:
3
생각
- 레이저 꺽이는 규칙
- 레이저의 방향이 90도씩 꺽이는 것을 생각했음
- 이때 꺽이는 방향이 거울기준 상하좌우에 따라 달랐음
- 상하, 좌우 이렇게 꺽이는 방향이 일정함
- 따로 생각 하기로 함
- ' \ ' 를 1, ' \ ' 를 -1 로 생각
- 상하 일때는 + , 좌우 일때는 -로 더함
- 입력 숫자에 따른 방향과 처음 위치
- 입력 숫자에 n으로 나눈 몫으로 상하좌우 선택
- 이때 나머지가 0인경우는 -1을 해줌
- 시작 위치 좌표는 방향에 따라 달리해줌
- 0인 경우
- x좌표는 0
- y 좌표는 나머지에 따라 오름차순
- 1인 경우
- x좌표는 나머지에 따라 오름차순
- y 좌표는 n - 1
- 2인 경우
- x좌표는 n - 1
- y 좌표는 나머지에 따라 내림차순
- 3인 경우
- x좌표는 나머지에 따라 내림차순
- y 좌표는 0
- 0인 경우
코드 [ Python ]
# 홀짝 구분
def odd(num):
return num % 2
# 동서남북 방향 정하기
def dir_start(num):
if num % n:
return num // n
else:
return (num // n) - 1
# 시작 위치 찾기
def start_point(num):
if dir_num == 0:
return 0, ((num % n) + n - 1) % n
elif dir_num == 1:
return ((num % n) + n - 1 ) % n, n-1
elif dir_num == 2:
return n-1, (n - (num % n)) % n
else:
return (n - (num % n)) % n, 0
#격자 안에 있는지 확인
def in_range(x,y):
return 0 <= x and x < n and 0 <= y and y < n
# 방향 dx,dy
dxs = [ 1, 0, -1, 0]
dys = [ 0, -1, 0, 1]
n = int(input())
mirror_map = []
for i in range(n):
mirrors = str(input())
mirror_map.append([])
mirror_num = 0
# '\\'를 하나로 보지 않고 2개로 봐버림
'''while(mirror_num < n):
if mirrors[mirror_num] == '\\':
#print(mirrors[mirror_num])
mirror_map[i].append('A')
else:
mirror_map[i].append('B')
#print(mirrors[mirror_num])
'''
for mirror in mirrors:
if mirror == "\\":
mirror_map[i].append(1)
else:
mirror_map[i].append(-1)
start = int(input())
count = 0
#방향과 시작 좌표 가져오기
dir_num = dir_start(start)
x, y = start_point(start)
while(in_range(x,y)):
if odd(dir_num):
dir_num = (dir_num + mirror_map[x][y]) % 4
else:
dir_num = (dir_num - mirror_map[x][y]) % 4
count += 1
x ,y = x + dxs[dir_num], y + dys[dir_num]
print(count)
틀린 이유
- 이번에는 틀리지 않았지만 뭔가 수상함
다른 분들 풀이
( 내가 푼게 최적일리가 없어 )
실력 진단 결과
'코딩테스트' 카테고리의 다른 글
백준 1303 : 전쟁 (0) | 2025.05.03 |
---|---|
백준 10026 : 적록색약 (0) | 2025.05.03 |
백준 2644 : 촌수계산 (0) | 2025.03.09 |
백준 1793: 타일링 (0) | 2025.03.07 |
Least Recently Used (2) | 2025.02.03 |