A 가지 한 두름 주세요
간단한 배열 탐색 문제. 10*10 크기의 작은 배열이기 때문에 그냥 브루트포스 돌려서 모든 행과 열을 탐색해 똑같은 문자로만 이루어진 행, 열이 존재하면 1, 아니면 0을 출력한다.
D :rightplant:
정말 심각하게 시간 오래 끌어서 패널티 폭탄 맞은 문제.
양쪽으로 배열 관리를 하며 다음 수를 왼쪽에 넘겨줄지, 오른쪽에 넘겨줄지 결정한다. 결정 기준은 새로 추가될 숫자를 포함 왼쪽과 오른쪽의 차이가 가장 적게 나는 쪽으로 넘겨주면 된다.
[left - 1 - right]와 같은 식으로 배열을 관리하면 되는데, 만약 left 총합 + 1보다 right 총합이 크거나 같다면 left의 모든 숫자들을 1씩 증가시키고 1을 left에 append. 아닌 경우는 반대로 right의 모든 숫자를 1씩 증가시키고 1을 right에 append.
마지막으로 left와 right 모두 내림차순이기 때문에 right만 정렬해 주고 left+right를 출력한다.
E 가지 오이 당근
케이스 분리 다 끝내지도 않고 즉흥적으로 코드 거지같이 짜다가 디버깅 지옥에 빠져서 결국 시간 안에 못 끝냈다. 시간 없다고 코드 대충 짜는 거 진짜 버려야 할 습관이다... 항상 효율을 생각하면서 코드를 짜자...
한 테스트케이스의 입력을 받은 후에 가지, 오이, 당근, 비김, 승리, 패배의 수를 센다. 물음표인 경우는 수도 세고 위치도 기록해 둔다. 비김이 0도 아니고 N도 아닌 경우는 존재할 수 없으므로 NO를 출력한다. 비김이 0인데 가지, 오이, 당근 모두 0 이상인 경우도 존재할 수 없으니 NO를 출력.
비김이 N인 경우는 N이 2라면 비길 수 없으므로 NO를 출력. N이 2보다 크면 가지, 오이, 당근 중 0인 것이 한 개인 경우와 두 개인 경우로 나뉜다. 0인 것이 두 개인 경우, 0이 아닌 것으로 물음표 자리를 모두 채우고, 0인 것이 한 개인 경우, 0인 것으로 물음표 자리를 채운다. YES 출력하고 수정한 배열 출력.
나머지 경우는 이긴 야채와 진 야채를 확인한다. 처음으로 물음표가 아닌 칸의 승패를 확인해서 승리 야채와 패배 야채를 확인한다. 나머지 모든 물음표가 아닌 칸을 검증해서 승리 조건에 부합하면 물음표들을 승리 조건에 맞도록 바꿔주고 YES와 수정한 배열을 출력. 만약 승리 조건에 부합하지 않는 것이 나온다면 NO를 출력.
아 이걸 3000B가 넘는 미친 스파게티 코드로 만들어버렸다.... 정말 어이가 없고요...
H 신기한 미로의 가지
이제는 조금 익숙해진 인터랙티브 문제
방문한 곳인지 확인하면서 maze를 출력한다.
처음 온 곳인 경우, 이전 노드의 자식 노드로 등록하고 방문한 상태로 기록한다.
왔던 곳인 경우, 이전 노드의 자식 노드라면 더 이상 갈 곳이 없는 것이므로 2단계 상위 노드로 이동한다.
왔던 곳인데 이전 노드의 부모 노드라면 한 번 더 maze를 해본다.
방문한 곳인지 확인 한 노드가 N개가 되면 이 과정을 끝내고 모든 노드의 자식 노드 목록을 하나씩 출력.
느낀 점
기껏 공부해서 알게 된 걸 왜 모르는 사람처럼 푸는지 이해를 못하겠고요... 다음에는 스코어보드 보면서 젤 쉽게 풀리는 문제 2개를 풀고 나머지 문제를 읽어본 후에 가능하겠다 싶은 문제가 있다면 그 문제로, 없다면 스코어보드를 참고하는 식으로 해봐야겠다.
제일 심각한 건 정확한 해법 생각 안하고 대충 맞길 바라는 기도메타. D번 문제 푸는데 '어떻게 해야 문제에서 원하는 조건을 만족할 수 있는가'를 생각하는 게 아니라 '어떻게 해야 대충 그럴싸한가'를 생각하는 나를 발견... 왜 그랬는지 정말 모르겠으나 확신이 아니라 근거도 아예 없는 아이디어로 만든 코드를 제출하는 그런 짓을 하면서 시간을 30분 이상 날려먹었다. 천천히 생각해보니 아이디어 떠올리는데 그리 긴 시간이 드는 문제도 아니었다.
많조분 문제인 거 알았으면 케이스 분리를 잘 해놓고 코드를 짜자. 내가 무슨 ICPC에서 1~2위를 다투는 천재 프로그래머도 아니고 이런 문제 생각과 동시에 코딩 가능하다는 건방진 생각 제발 자제 좀... 왜 즉흥적으로 짜는 거야 자꾸...
그래도 인터랙티브 문제 버벅임 없이 잘 해결했다는 수확이 있었다. 카툰컵에서 브2 인터랙티브 문제에 10번이나 틀렸습니다+시간초과를 띄운 괴기스러운 일이 있었는데 이번에 인터랙티브 문제에 갖고있던 막연한 공포감이 좀 해소된 것 같다.
또 문제를 읽고 유형을 캐치하는 능력도 좀 생겼구나 싶었다. 입력으로 주어지는 수치의 범위 제한과 시간 제한을 보면서 브루트포스가 가능한지, 어떤 접근이 가능한지 가늠할 수 있었다.
아유 오랜만에 아레나였는데... E번 만 시간 안에 풀었어도 티어 좀 올릴 수 있었을 것 같은데 어림도 없겠습니다...