-
[월간 코드 챌린지1] 삼각달팽이 (java, 2차원 배열 생성X)알고리즘/프로그래머스 2022. 9. 29. 18:27
https://school.programmers.co.kr/learn/courses/30/lessons/68645
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제풀이 전]
처음 봤을 때, result가 2차원 배열 나열한 느낌이라 2차원 배열로 만들고 다시 1차원 배열에 넣으면서 풀면 되겠다 ~ 싶었는데(n도 1000이하라서), 뭔가 2차원 배열없이도 풀 수 있을 것 같아서 이 방법은 패스하고 생각해봤다.
우선 회전할 때 아래와 같이 진행된다.
↙→↖ 이 3가지 방향으로 진행됨을 알 수 있다.
그리고 화살표의 길이(=숫자의 수)를 보면 n, n-1, n-2 ... 1 순으로 줄어드는 것을 알 수 있다.
이 두가지를 고려한 루프를 작성하고 index 위치만 적절한 곳에 지정하여 숫자를 대입하면 정답이다.
[문제풀이]
class Solution { public int[] solution(int n) { int size = 0; for(int i=n;i>0;i--) size+=i; int[] answer = new int[size]; int num=0; int idx=0; int flag=0; for(int i=n;i>0;i--){ if(flag%3==0){ for(int j=0;j<i;j++){ idx+=j+(flag/3*2); answer[idx]=++num; } } else if(flag%3==1){ for(int j=0;j<i;j++) answer[++idx]=++num; } else{ for(int j=0;j<i;j++){ idx=idx-n+j+(flag/3); answer[idx]=++num; } } flag++; } return answer; }
num 현재 숫자 idx 마지막으로 위치한 index값 저장 flag 현재 몇번째 회전인지 + 방향 파악을 위한 변수
- flag %3== 0 이면 ↙
- flag %3== 1 이면 →
- flag %2== 2 이면 ↖int j 위에서 언급한 화살표의 길이(=추가하는 숫자의 수) index 계산법
1. ↙ : (해당 줄에 있는 숫자-1)만큼 더하면 다음 줄의 첫번째 index가 된다. 예를들어, 첫번째로 이 방향이 진행될 때는 0,1,2,3 순으로 더해준다.
2. → : 오른쪽으로 이동. 따라서, +1
3. ↖ : 해당 줄에 있는 숫자만큼 빼주면 다음 줄의 마지막 index가 된다. 예를 들어, 첫번째로 이 방향이 진행될 때는 n, n-1 순으로 빼준다
4. 고려사항
- 3방향으로 모두 회전하고 나면 안의 삼각형은 꼭대기하나, 위에서 하나, 아래에서 하나의 줄이 제외된다. 따라서 ↙ 경우에는 회전한 숫자*2를 ↖ 경우에는 회전한 숫자를 더해준다.
[comment]
새로운 방법으로 풀고 싶어서 좀 더 복잡한 방법을 선택했는데 규칙을 찾아내는 재미가 있었던 것 같다.
다만, 설명하기에 어려움이 있는 걸봐서 좋은 코드라고 하기에는 어려운것 같기도 하다. 코딩테스트나 이 문제를 적용해야하는 경우가 있다면 이차원 배열을 이용해 깔끔하게 풀어내는 것이 좋을 것 같다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[월간 코드 챌린지1] 풍선 터트리기 (java) (1) 2022.09.23 [카카오 인턴] 키패드 누르기 (c++, 파이썬) (0) 2022.07.27 카카오프렌즈 컬러링북 (c++) (0) 2022.07.27