[Linux]부트캠프 - 파일 및 폴더 생성
파일 및 폴더 생성
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다.
이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다.
아래 그림은 원판이 5개인 경우의 예시이다.
첫째 줄에 첫 번째 장대에 쌓인 원판의 개수 N (1 ≤ N ≤ 20)이 주어진다.
첫째 줄에 옮긴 횟수 K를 출력한다.
두 번째 줄부터 수행 과정을 출력한다. 두 번째 줄부터 K개의 줄에 걸쳐 두 정수 A B를 빈칸을 사이에 두고 출력하는데, 이는 A번째 탑의 가장 위에 있는 원판을 B번째 탑의 가장 위로 옮긴다는 뜻이다.
3
7
1 3
1 2
3 2
1 3
2 1
2 3
1 3
재귀함수의 대표적인 문제라고 할 수 있는 하노이의 탑이다.
워낙 다른 분들이 잘 정리해놓으신 분들이 많기 때문에, 질 좋은 설명은 구글링 하시는 것을 추천드린다.
우선 원판의 개수를 받아주자.
N = int(input())
그리고 예제 출력을 보면, 총 횟수가 나오고 그 다음에 어디서 어디로 옮겼는지가 나온다. 따라서, 이동하는 데이터들을 미리 받아놓으려고한다. 이동 데이터 리스트의 길이가 총 이동횟수이기 때문이다.
옮기기 전 위치
와 옮기려는 위치
를 받기 위한 리스트들을 만들어 주자.
start_lst = []
target_lst = []
문제를 보면 총 3개의 장대가 있다. 1번 장대에 쌓여있는 N
개의 원판을 3번 장대로 옮기는 것이 목표다. 그렇다면 2번 장대는 원판을 옮기기 위한 보조 장대로 볼 수 있다.
이제 그림을 통해서 구조를 이해해보자.
만약에 1개의 원판을 1번 장대에서 3번장대로 옮겨야하는 경우는 어떨까?
이런 상태일 것이다. 그렇다면 한 번만 3번 장대로 옮기면 끝난다.
이렇게 표현할 수 있다.
시도1 : 1 -> 3
만약에 2개의 원판이라면 어떨까?
이런 상태일 것이다.
시도1 : 1 -> 2
위에 있는 2번 원판이 보조 장대로 옮겨진다.
시도2 : 1 -> 3
그렇다면 1번에 있는 가장 큰 원판인 1번원판이 목표 장대인 3번 장대로 옮겨진다.
시도3 : 2 -> 3
마지막으로 보조장대인 2번장대에 있던 2번 원판이 목표장대인 3번 장대로 옮겨지며 문제가 해결된다.
대강 흘러가는 흐름을 알았으니 코드로 한번 구성해보자.
우리가 작성하려는 함수에는 4개의 파라미터가 들어갈 것이다.
n
= 원판의 개수, start
= 시작하는 장대, target
= 옮기려는(목표하는) 장대, support
= 보조 장대
그리고 위에서 만든 변수들을 함수에서 사용하기 위해서 전역변수를 사용해주자.
def hanoi(n, start, target, support):
global start_lst
global target_lst
위의 예제처럼 원판이 한개였을 경우에는 어땠나?
바로 시작 장대에서 목표 장대로 한번만 옮겨주면 끝났다.
만약 함수로 표현한다면 hanoi(1, 1, 3, 2) 가 될 수 있을 것이다.
옮기기 시작점과 옮기는 목표점들을 각각 만들어놓은 리스트에 append해주자.
이 경우에는 재귀가 끝나도록 return을 적용시켜줘야한다.
if n == 1:
start_lst.append(start)
target_lst.append(target)
return
만약에 2인 경우였다면 어땠을까? 함수로 표현한다면 hanoi(2, 1, 3, 2) 로 볼 수 있다.
재귀함수가 들어가야할 타이밍이 여기다.
위에서 보았듯이 2번 원판이 1번 장대에서 보조장대인 2번 장대로 옮겨진다. 3번 장대는 보조 장대로 밀려버리게 된다. 코드로 표현하면 이렇다.
# 2번 원판, 1 -> 2
hanoi(n-1, start, support, target)
# n이 1이므로
# start_lst == [1]
# target_lst == [2]
그리고 나서 가장 넓은(큰) 원판인 1번 원판이 이제 옮겨질 차례다. 1번 장대에서 3번장대로 옮겨지므로, 기존에 적혀진 start(1)와 tagret(3)이 append된다.
# 1번 원판, 1 -> 3
start_lst.append(start)
target_lst.append(target)
# start_lst == [1, 1]
# target_lst == [2, 3]
가장 큰 1번 원판을 목표 장대인 3번 장대로 옮기는데 성공했다면 이제 우리가 해야할 일은 무엇일까?
바로 보조 장대인 2번 장대에 있는 2번 원판을 목표 장대인 3번 장대로 옮기는 것이다.
여기서도 함수를 사용해주자.
# 2번 원판, 2 -> 3
hanoi(n-1, support, target, start)
# n이 1이므로
# start_lst == [1, 1, 2]
# target_lst == [2, 3, 3]
이렇게 되면 총 3번의 횟수로 하노이탑 쌓기가 성공한다.
입력 N
이 2인 경우이기 때문에 출력은 다음과 같다.
2
1 2
1 3
2 3
따라서 이렇게 나오게 하려면 함수를 밖에서 호출해준 후, 리스트에 있는 값들로 출력을 해줘야한다.
리스트의 길이가 총 시행횟수이고, 출발점과 도착점을 zip
하여 순서대로 출력해주면 된다.
hanoi(N, 1, 3, 2)
print(len(start_lst))
for i,j in zip(start_lst, target_lst):
print(i, j)
설명을 잘 못하는 편이라 도움이 될지는 모르겠지만, 3으로 입력값을 넣어보면 예제처럼 잘 출력될 것이다.
그리고, 문제를 풀면서 알게된 점인데 총 이동 횟수는 원판에 수에 따라 규칙이 있더라.
1개 = 1번
2개 = 1번 + 2번(원판 개수가 하나 적은 경우의 횟수보다 1 큰)
3개 = 1번 + 2번 + 4번(원판 개수가 하나 적은 경우의 횟수보다 1 큰)
4개 = 1번 + 2번 + 4번 + 8번
5개 = 1번 + 2번 + 4번 + 8번 + 16번
만약 n이 5일 경우라면
X = (n-4일 경우) + (n-3일 경우) + (n-2일 경우) + (n-1일 경우) + (n일 경우)
어쨌든 수열이라는 것이다.
def N(n):
if n == 1:
return 1
result = (N(n-1)+1) + N(n-1)
return result
print(N(3))
N = int(input())
start_lst = []
target_lst = []
def hanoi(n, start, target, support):
global start_lst
global target_lst
if n == 1:
start_lst.append(start)
target_lst.append(target)
return
hanoi(n-1, start, support, target)
start_lst.append(start)
target_lst.append(target)
hanoi(n-1, support, target, start)
hanoi(N, 1, 3, 2)
print(len(start_lst))
for i,j in zip(start_lst, target_lst):
print(i, j)
문제 푼 날짜 | 체크 |
---|---|
2022-06-19 | ✔ |
파일 및 폴더 생성
파일 시스템 탐색
도움말(man -> manual)
명령어 기초
유닉스(Unix)
특정 코드 지연 실행 - DispatchQueue.main.asyncAfter(deadline: )
Naming Conventions
안드로이드 폰과 맥북에어 M1 USB 테더링 성공
Simulator 풀 스크린 사용 방법
10807번 - 개수 세기
프로그래머스 Lv.1 풀이 코드 모음
프로그래머스 Lv.1 풀이 코드 모음
11047번 - 동전 0
11659번 - 구간 합 구하기 4
14888번 - 연산자 끼워넣기
9184번 - 신나는 함수 실행
24416번 - 알고리즘 수업 - 피보나치 수 1
2580번 - 스도쿠
9663번 - N-Queen
15652번 - N과 M (4)
15651번 - N과 M (3)
15650번 - N과 M (2)
25305번 - 커트라인
25304번 - 영수증
3003번 - 킹, 퀸, 룩, 비숍, 나이트, 폰
15649번 - N과 M (1)
2004번 - 조합 0의 개수
1676번 - 팩토리얼 0의 개수
9375번 - 패션왕 신해빈
1010번 - 다리 놓기
11051번 - 이항 계수 2
11050번 - 이항 계수 1
3036번 - 링
2981번 - 검문
1934번 - 최소공배수
2609번 - 최대공약수와 최소공배수
1037번 - 약수
5086번 - 배수와 약수
1358번 - 하키
1004번 - 어린 왕자
1002번 - 터렛
3053번 - 택시 기하학
2477번 - 참외밭
4153번 - 직각삼각형
3009번 - 네 번째 점
1085번 - 직사각형에서 탈출
11478번 - 서로 다른 부분 문자열의 개수
1269번 - 대칭 차집합
1764번 - 듣보잡
10816번 - 숫자 카드 2
1620번 - 나는야 포켓몬 마스터 이다솜
14425번 - 문자열 집합
10815번 - 숫자 카드
18870번 - 좌표 압축
10814번 - 나이순 정렬
1181번 - 단어 정렬
11651번 - 좌표 정렬하기 2
11650번 - 좌표 정렬하기
1427번 - 소트인사이드
2108번 - 통계학
10989번 - 수 정렬하기 3
2751번 - 수 정렬하기 2
2750번 - 수 정렬하기
22.06.25 ~ 27 부산 먹부림 기록
1436번 - 영화감독 숌
1018번 - 체스판 다시 칠하기
7568번 - 덩치
2231번 - 분해합
2798번 - 블랙잭
11729번 - 하노이 탑 이동 순서
2447번 - 별 찍기 - 10
17478번 - 재귀함수가 뭔가요?
10870번 - 피보나치 수 5
10872번 - 팩토리얼
9020번 - 골드바흐의 추측
4948번 - 베르트랑 공준
1929번 - 소수 구하기
11653번 - 소인수분해
2581번 - 소수
1978번 - 소수 찾기
10757번 - 큰 수 A+B
2839번 - 설탕 배달
2775번 - 부녀회장이 될테야
10250번 - ACM 호텔
2869번 - 달팽이는 올라가고 싶다
1193번 - 분수찾기
2292번 - 벌집
1712번 - 손익분기점
1316번 - 그룹 단어 체커
2941번 - 크로아티아 알파벳
5622번 - 다이얼
2908번 - 상수
1152번 - 단어의 개수
1157번 - 단어 공부
2675번 - 문자열 반복
10809번 - 알파벳 찾기
11720번 - 숫자의 합
11654번 - 아스키 코드
1065번 - 한수
4673번 - 셀프 넘버
15596번 - 정수 N개의 합
4344번 - 평균은 넘겠지
8958번 - OX퀴즈
25083번 - 새싹
Spark Bigdata Pipeline
Spark 3일차
Spark 2일차
1546번 - 평균
Spark 1일차
Hadoop🐘
3052번 - 나머지
2577번 - 숫자의 개수
2562번 - 최댓값
10818번 - 최소, 최대
Linux
MongoDB 조회 문제
MongoDB
1110번 - 더하기 사이클
10951번 - A+B - 4
Oracle 3️⃣
ORACLE 연습용 문제 만들기 숙제
10952번 - A+B - 5
Oracle 2️⃣
2480번 - 주사위 세개
Oracle Day1️⃣
Tensorflow
Big Data
2525번 - 오븐 시계
10871번 - X보다 작은 수
2439번 - 별 찍기 - 2
2438번 - 별 찍기 - 1
11022번 - A+B - 8
11021번 - A+B - 7
2742번 - 기찍 N
2741번 - N 찍기
15552번 - 빠른 A+B
8393번 - 합
10950번 - A+B - 3
9️⃣ 2739번 - 구구단
2884번 - 알람 시계
14681번 - 사분면 고르기
⛏크롤링(Crawling)
2753번 - 윤년
Django 복습 4️⃣
Django 복습 3️⃣
💯 9498번 - 시험 성적
1330번 - 두 수 비교하기
✖ 2588번 - 곱셈
➗ 10430번 - 나머지
Django 복습 2️⃣
Django 복습 1
MySQL 복습!
⁉10926번 - ??!
🆎1008번 - A/B
👩🦲 18108번 - 1998년생인 내가 태국에서는 2541년생?!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🎈✨경 축✨🎈
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
선형 자료구조(1일차에 이어서)
🆎10998번 - A×B
🆎1001번 - A-B
🆎1000번 - A+B
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🐶10172번 - 개
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
🐱10171번 - 고양이
[해당 포스트는 유튜버 나동빈님의 영상을 참고했습니다.]
❤10718번 - We love kriii
🖐2557번 - Hello World
Today I Learned(TIL)📌 (2021.12.31)
Today I Learned(TIL)📌 (2021.12.30)
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!
[noitce!!] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!