일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 막대기자르기
- 사회초년생
- 자료구조
- 후니의쉽게쓴시스코네트워킹
- leetcode
- 정보처리기사개정
- 후니의쉽게쓴시스코라우팅
- 코딩테스트
- 실업급여
- 생애첫계약
- C++
- 캡쳐링
- IT기초
- 프로그래머스
- 실업인정인터넷신청
- 정보
- 순열
- 전화영어
- 회사폐업
- 모여봐요동물의숲
- 네트워크
- 청년내일채움공제
- 부분합알고리즘
- HeadFirstDesignPatterns
- 알고리즘
- array
- 튜터링
- 취업사실신고
- 동적계획법
- 자취준비
- Today
- Total
따봉도치야 고마워
[프로그래머스] 종이접기 본문
문제 설명
직사각형 종이를 n번 접으려고 합니다. 이때, 항상 오른쪽 절반을 왼쪽으로 접어 나갑니다. 다음은 n = 2인 경우의 예시입니다.
먼저 오른쪽 절반을 왼쪽으로 접습니다.
다시 오른쪽 절반을 왼쪽으로 접습니다.
종이를 모두 접은 후에는 종이를 전부 펼칩니다. 종이를 펼칠 때는 종이를 접은 방법의 역순으로 펼쳐서 처음 놓여있던 때와 같은 상태가 되도록 합니다. 위와 같이 두 번 접은 후 종이를 펼치면 아래 그림과 같이 종이에 접은 흔적이 생기게 됩니다.
위 그림에서 ∨ 모양이 생긴 부분은 점선(0)으로, ∧ 모양이 생긴 부분은 실선(1)으로 표시했습니다.
종이를 접은 횟수 n이 매개변수로 주어질 때, 종이를 절반씩 n번 접은 후 모두 펼쳤을 때 생기는 접힌 부분의 모양을 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- 종이를 접는 횟수 n은 1 이상 20 이하의 자연수입니다.
- 종이를 접었다 편 후 생긴 굴곡이 ∨ 모양이면 0, ∧ 모양이면 1로 나타냅니다.
- 가장 왼쪽의 굴곡 모양부터 순서대로 배열에 담아 return 해주세요.
입출력 예
n / result
1 | [0] |
2 | [0,0,1] |
3 | [0,0,1,0,0,1,1] |
입출력 예 설명
입출력 예 #1
종이의 오른쪽 절반을 왼쪽으로 한번 접었다 펴면 아래 그림과 같이 굴곡이 생깁니다.
따라서 [0]을 return 하면 됩니다.
입출력 예 #2
문제의 예시와 같습니다.
입출력 예 #3
종이를 절반씩 세 번 접은 후 다시 펼치면 아래 그림과 같이 굴곡이 생깁니다.
따라서 [0,0,1,0,0,1,1]을 return 하면 됩니다.
풀이
- 찾아낸 공식은 2가지
1)
- 한 번 씩 더 접을 때마다, 기존에 접힌 부분(a)은 그대로 남고
- 처음 접은 0을 기준으로 반대편에 a와 반대되는 값이 반전되어 생김
-> 즉 기존 배열에 0을 추가하고, 기존 값을 좌우반전+ 값반전(0->1, 1->0) 해서 추가하면 됨.
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
list.add(0);
for(int i=0; i<n-1; i++){
list.addAll(calc(list));
}
return list.stream().mapToInt(i->i).toArray();
}
ArrayList<Integer> calc(ArrayList<Integer> list){
ArrayList<Integer> temp = new ArrayList<>();
temp.add(0);
for(int i=list.size()-1; i>=0; i--){
temp.add((list.get(i)==0) ? 1:0);
}
return temp;
}
}
2)
- 한 번 씩 더 접을 때마다, 바로 직전에 접었던 부분을 중심으로 앞 뒤에 0,1 이 생김
-> 이전에 접힌 자국 앞 뒤에 0, 1 추가
-> 실행 시 마지막 테스트 케이스 시간초과 남.
import java.util.ArrayList;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
int flag = 0;
list.add(0);
for(int i=0; i<n-1; i++){
for(int j=0; j<=list.size(); j+=2){
list.add(j,flag);
flag = (flag==0) ? 1:0;
}
}
return list.stream().mapToInt(i->i).toArray();
}
}
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[수학] 중복순열과 중복조합 (0) | 2020.06.02 |
---|---|
[프로그래머스] 지형 이동 (0) | 2020.06.01 |
[프로그래머스] 방문 길이 (0) | 2020.05.27 |
[프로그래머스] 징검다리 건너기 (0) | 2020.05.27 |
[프로그래머스] DFS/BFS : 네트워크 (0) | 2020.05.25 |