- [코테] GSHS x SASA 후기2026년 01월 03일
- ZaMan
- 작성자
- 2026.01.03.:41
첫 코테 대회로 2026년 1월 2일 오후 7시부터 10시에 열리는 GSHS x SASA 프로그래밍 경시대회 Open Contest를 참가하게 되었습니다.
해당 대회는 1~3인으로 팀을 구성하여 나갈 수 있었기에, 학교 친구 ddungsam과 팀을 맺고 zaman_gosu 깡계를 만들어 참가하였습니다 :)
문제 제출만 하면 solved.ac에서 사용 가능한 프로필 뱃지를 주고, 문제 2개 이상 해결 시 배경 스킨을 준다는 점에 저는 홀려서 최대한 열심히 참여해보았습니다.
생각보다 많이 어렵다
다른 대회를 보면 브론즈 문제도 많아서 아직 실버인 저도 쉽게 한 문제 이상은 해결할 수 있을 것이라고 생각했습니다.
그래서 제일 쉬웠던 문제인 A번을 골라서 풀기 시작했는데, 결국 2시간 30분동안 시달려서 겨우 해결하였습니다.
때문에 시간이 얼마 남지 않아 저는 한 문제만 풀고 대회를 마무리 하였습니다.
그래도 ddungsam이 C번을 풀어주어서 총 두 문제 해결로 배경 스킨을 얻은 채로 만족을 하였습니다.
이 대회를 참여하고 나서, 제일 쉬운 한 문제밖에 해결하지 못한 저는 다른 대회를 참여하기 전까지 랜덤한 골드 문제까지 쉽게 풀 수 있을 정도로 실력을 키우는 것이 중요한 것 같다고 생각이 들었습니다.
A번 - 자기장 측정기를 어떻게 풀었을까



처음에는 반복문을 사용하여 로봇을 명령에 따라 한 칸씩 계속 이동시키면서 위치를 저장하고, 순회하면서 도선을 지났는지, 자기장이 기존의 최대 자기장보다 더 높은 지를 확인하도록 코드를 작성하였습니다.
그렇게 제출을 하였더니

바로 틀려버렸습니다. 그래서 ddungsam이 코드에서 잘못된 부분을 말해주었습니다.

저는 입력을 받을 때 아래 코드와 같이, 무조건 명령 한 글자, 숫자 한 글자 이런 식으로 순회를 하도록 하였습니다.
for i in range(len(command) // 2): command_real_bubun = command[i * 2] command_number_bubun = (int)(command[i * 2 + 1])그래서 두 글자 이상에 대해서는 밀리게 되어서 틀리게 되었던 것이었습니다.
이 잘못된 부분을 수정하고 있을 때 ddungsam에게 메시지가 더 왔습니다.

이 메시지를 보고 생각해 보니 제가 위해서 말했던 방식대로 한다면 명령은 최대 1e4이고, 이동하는 거리는 최대 1e5여서, 이론상 1e9(10억) 이상의 시간복잡도가 나올 수 있었습니다.
그래서 한 칸씩 이동하면서 위치를 저장하는 것이 아닌 로봇의 한 번의 이동 명령에 대해서 이동 거리를 선분으로 저장하여 출력을 위한 계산을 하도록 하였습니다.
로봇이 도선을 지나는 경우
로봇이 도선을 지났다는 것은 이동한 거리에 대한 선분에 도선이 포함이 되어있다는 것을 의미합니다.
그래서 x축으로 이동할 때는 선분은 y가 같고, x의 최소와 최대 사이에 포함되면 도선을 지나고,
y축으로 이동할때는 선분은 x가 같고, y의 최소와 최대 사이에 포함되면 도선을 지난 것으로 하였습니다.

if max(x1, x2) >= dosun_x >= min(x1, x2) and dosun_y == y1: print(-1) get_dosun = True
if max(y1, y2) >= dosun_y >= min(y1, y2) and dosun_x == x1: print(-1) get_dosun = True이제 도선을 지나는 경우를 완료했으니, 자기장이 최대인 점만 구하면 됩니다.
자기장이 최대인 점 구하기
자기장이 최대 일려면 도선과 선분 사이의 거리가 제일 작아야 합니다.
그래서 아래와 같은 방식을 사용하여 각 선분마다 자기장이 최대인 점을 저장하였습니다.
x축으로 이동할 때 도선과 직선 사이의 거리가 제일 작은 점은 (도선의 x좌표, 직선의 y좌표)입니다.
그러나, 도선의 x좌표는 선분의 x좌표보다 크거나 작을 수 있으니, 경우에 맞춰 x좌표를 수정한다면 도선과 선분 사이의 거리가 됩니다.
y축으로 이동할 때는 x랑 비슷하게 (직선의 x좌표, 도선의 y좌표)에서 도선의 y좌표가 선분의 y좌표보다 크거나 작을 수 있으니, 경우에 맞춰 y좌표를 수정해 주면 도선과 선분 사이의 거리가 됩니다.

이론을 그림으로 표현 # x축으로 이동하는 경우 if max(x1,x2) >= dosun_x >= min(x1, x2): # 도선의 x좌표가 선분의 x좌표에 포함될때 distance_info.append([dosun_x,y1]) elif dosun_x >= max(x1, x2): # 도선의 x좌표가 선분의 최대 x좌표보다 클때 distance_info.append([max(x1, x2), y1]) else: # 도선의 x좌표가 선분의 최소 x좌표보다 작을때 distance_info.append([min(x1, x2), y1])# y축으로 이동하는 경우 if max(y1,y2) >= dosun_y >= min(y1, y2): # 도선의 y좌표가 선분의 y좌표에 포함될때 distance_info.append([x1, dosun_y]) elif dosun_y >= max(y1, y2): # 도선의 y좌표가 선분의 최대 y좌표보다 클때 distance_info.append([x1, max(y1, y2)]) else: # 도선의 y좌표가 선분의 최소 y좌표보다 작을때 distance_info.append([x1, min(y1, y2)])이제 distance_info에 저장된 좌표를 순회하면서 최소 거리를 구하고 출력하면 끝입니다!
추가적으로 명령은 무조건 1개 이상이므로, 움직이지 않고 회전만 했을 때, 로봇이 도선의 위치에 있다면 -1을 출력하도록 해주었습니다.
if robot_position == dosun_position: print(-1) else: print(0, 0)완성본
import sys I = sys.stdin.readline dosun_position = list(map(int, I().split())) command = I().strip() robot_position = [0,0] robot_rotation = 0 position_info = [] commands = [i for i in command if not i.isdigit()] nums = [] distance_info = [] get_dosun = False tmp = command.split("S") for i in tmp: nums += i.split("T") nums = [int(i) for i in nums if i] for i in range(len(command)): if command[i] == 'T' or command[i] == 'S': now_command = command[i] for i in range(len(commands)): if commands[i] == 'T': robot_rotation = (robot_rotation + nums[i]) % 4 else: temp = robot_position[::] if robot_rotation == 0: robot_position[0] += nums[i] elif robot_rotation == 1: robot_position[1] += nums[i] elif robot_rotation == 2: robot_position[0] -= nums[i] elif robot_rotation == 3: robot_position[1] -= nums[i] position_info.append([temp[0], temp[1], robot_position[0], robot_position[1], robot_rotation]) if i == len(commands) - 1: for ii in range(len(position_info)): position = position_info[ii] rotation = position[4] if rotation == 0 or rotation == 2: if max(position[0], position[2]) >= dosun_position[0] >= min(position[0], position[2]) and dosun_position[1] == position[1]: print(-1) get_dosun = True break if max(position[0],position[2]) >= dosun_position[0] >= min(position[0], position[2]): distance_info.append([dosun_position[0],position[1]]) elif dosun_position[0] >= max(position[0], position[2]): distance_info.append([max(position[0], position[2]), position[1]]) else: distance_info.append([min(position[0], position[2]), position[1]]) else: if max(position[1], position[3]) >= dosun_position[1] >= min(position[1], position[3]) and dosun_position[0] == position[0]: print(-1) get_dosun = True break if max(position[1],position[3]) >= dosun_position[1] >= min(position[1], position[3]): distance_info.append([position[0],dosun_position[1]]) elif dosun_position[1] >= max(position[1], position[3]): distance_info.append([position[0], max(position[1], position[3])]) else: distance_info.append([position[0], min(position[1], position[3])]) if get_dosun == False and len(distance_info) >= 1: min_index = 0 min_distance = 0 for i in range(len(distance_info)): distance = pow(dosun_position[0] - distance_info[i][0], 2) + pow(dosun_position[1] - distance_info[i][1], 2) if i == 0: min_distance = distance else: if distance < min_distance: min_distance = distance min_index = i print(distance_info[min_index][0], distance_info[min_index][1]) elif get_dosun == False and len(distance_info) == 0: if robot_position == dosun_position: print(-1) else: print(0, 0)코테 관련 블로그는 처음 작성해 보고, 실력도 부족해서 글 작성을 잘 못한 점 양해 부탁드립니다..ㅎㅎ
다음글이전글이전 글이 없습니다.댓글