-
프로그래머스 LV1 - 택배 상자 꺼내기STUDY/ALGORITHM 2025. 2. 17. 22:22
내가 느끼기에, 프로그래머스의 문제들의 난이도가 같은 단계 내에서도 너무 상이하다.
0문제같은 1단계도 있는 반면에 2단계같은 1단계도 있다.
이 문제는 나름 1단계가 맞는거같긴 하다만, 깨나 애먹었다.
처음엔 이런식으로 접근했다.
public void solution(){ int n = 13; int w = 3; int num = 6; width = w; boolean currentDirection = true; int answer = 1; int offset = getOffset(num); while (true){ num += w; if(currentDirection) num += offset; else num -= offset; if(n < num) break; answer ++; currentDirection = !currentDirection; } System.out.println(answer); } private int getOffset(int num){ int mod = (num % width); int offset = -(width - 1); int range = isReversed(num)? width - mod : mod; for (int i = 0; i < range; i++) { offset +=2; } return offset; } private boolean isReversed(int num){ return (num / width + 1) % 2 == 0; }인덱스에 따라 offset을 만들어두고, num에서 offset에 따라 값을 보정한다.
시작을 정방향으로 보고, 다음층 부터 역방향 정방향을 번갈아가며 offset을 더했다 뺀다.
정확히 어떤경우인지를 모르겠으나 일부 테스트에 실패했다...
아무리 생각해도 더 심플 한 해결방법이 있을것 같다는 생각이 떠나질 않았다.
그래서 모든 층을 정방향으로 취급하고, 각 층의 인덱스만 좌우대칭으로 번갈아가며 바꿔보기로 한다.
public void solution(){ int n = 22; int w = 6; int num = 8; int answer = 0; while (num <= n) { // num은 반드시 n보다 커야함. int index = (num - 1) % w; // 현재 num의 인덱스 int diff = w - 1 - index; // 대칭이 되는 위치 num += 2 * diff + 1; // 대칭이 되는 위치로 이동. answer ++; } System.out.println(answer); }말도안되게 간단해졌다. 현재 인덱스를 기준으로 좌우대칭인 인덱스를 찾고, 그 인덱스까지 갈 수 있는 값을 계산한다.
이리하여 훨씬 간단하게 마무리 됐다.한번에 떠올려내진 못했지만, 시행착오를 거쳐 작은 단계의 해결부터 찾았다.
그리고 그 작은 단계를 통해 점화식을 완성하는데 성공했다.
직관으로 볼땐 복잡했던 문제를, 분석을 통해 간단히 도식화 하는게 참... 이 맛이 알고리즘 맛이 아닐까?
'STUDY > ALGORITHM' 카테고리의 다른 글
프로그래머스 LV1 - 기사단원의 무기 (1) 2025.02.24 프로그래머스 LV2 - 전화번호 목록 (0) 2025.02.24 프로그래머스 LV1 - 달리기 경주 (1) 2025.02.12 프로그래머스 LV1 - 공원 산책 (0) 2025.02.12 프로그래머스 LV1 - 대충 만든 자판 (1) 2025.02.11