[Linux]부트캠프 - 파일 및 폴더 생성
파일 및 폴더 생성
트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다.
상근이는 시간을 때우기 위해서 수학 게임을 하기로 했다.
먼저 근처에 보이는 숫자 N개를 종이에 적는다. 그 다음, 종이에 적은 수를 M으로 나누었을 때, 나머지가 모두 같게 되는 M을 모두 찾으려고 한다. M은 1보다 커야 한다.
N개의 수가 주어졌을 때, 가능한 M을 모두 찾는 프로그램을 작성하시오.
첫째 줄에 종이에 적은 수의 개수 N이 주어진다. (2 ≤ N ≤ 100)
다음 줄부터 N개 줄에는 종이에 적은 수가 하나씩 주어진다. 이 수는 모두 1보다 크거나 같고, 1,000,000,000보다 작거나 같은 자연수이다. 같은 수가 두 번 이상 주어지지 않는다.
항상 M이 하나 이상 존재하는 경우만 입력으로 주어진다.
첫째 줄에 가능한 M을 공백으로 구분하여 모두 출력한다. 이때, M은 증가하는 순서이어야 한다.
3
6
34
38
2 4
5
5
17
23
14
83
3
상당히 난이도가 있는 문제라서 구글에서 다른 풀이들을 많이 보고 풀었다. 예제와 같이 세개의 수 6, 34, 38이 주어졌을 경우에 생각해보자. 이 세 수의 M은 2와 4가 될 수 있다고 한다. 따라서
6 = ? + 2
34 = ? + 2
38 = ? + 2
이런 형식이 된다. 공통된 나머지를 제외할 경우에는 4, 32, 36 이렇게 되는데 이 수들은 공통된 수로 곱해진것이므로
4 = 1 x 4
32 = 8 x 4
36 = 9 x 4
이렇게 되었다고 볼 수 있다. 그러면 다시 종이에 적은 세가지 수를 이렇게 표현할 수 있다.
6 = 1 X 4 + 2
34 = 8 X 4 + 2
38 = 9 X 4 + 2
그렇다면 이 경우를 숫자가 아닌 식으로 표현하면 이렇게 표현할 수 있다.
A = (a * M) + n
B = (b * M) + n
C = (c * M) + n
여기서 + 되고있는 n을 제거하려면 B-A나 C-B같은 형태로 연산을 해줘야한다. 그러면 이런 결과가 나올 것이다.
B - A = (b-a) * M
C - B = (c-b) * M
이렇게 수를 뺄셈해준 것들은 M의 배수라는 것을 알 수 있다. 그러면 이것들의 최대공약수가 M이 될 수 있다. 그리고 나머지 M들은 최대공약수의 약수가 된다. 문제에 나와있는 예제 2번으로 이 설명을 다시 생각해보자. 예제 2번에서는 5, 17, 23, 14, 83 이렇게 5개의 수를 입력받고 있다. 그러면 이 수들을 순서대로 빼기를 해주자.
5 - 17 = -12
17 - 23 = -6
23 - 14 = 9
14 - 83 = -69
뺄셈을 해준 것들을 절대값만으로 생각해서 최대공약수를 구해보면, 최대공약수가 3이 나온다. 3은 1과 자기 자신을 제외하고는 없기때문에 출력이 3 하나만 나오게된다.
이제 코드로 문제를 해결해보자.
우선 라이브러리 두개를 호출해주자, gcd()
메소드를 사용하기 위한 math라이브러리와 입력속도를 줄이기 위한 sys라이브러리를 호출하자.
import sys
import math
그리고 수의 개수 N
을 받아주고 nums
라는 리스트를 만들어서 수들을 append해주자.
N = int(sys.stdin.readline())
nums = []
for i in range(N):
nums.append(int(sys.stdin.readline()))
이제 나누었을 때 똑같은 나머지를 제거하기 위한 작업을 해줘야한다.
리스트에 있는 각 수들을 뺄셈한 값을 구해주자.
M
이라는 빈 리스트를 만들어 반복문의 인덱스를 사용해 뺄셈을 하고 그 절대값만 M
에 append해주자.
반복문의 범위는 수가 3개일 경우 2번만 반복하면 되므로, 리스트 길이에서 -1 한 범위 까지 반복되게 만들자. 그리고 최대공약수 비교를 위해 리스트를 오름차순으로 정렬해주자.
M = []
for i in range(len(nums)-1):
M.append(abs(nums[i] - nums[i+1]))
M.sort()
이제 이러면 가장 작은 값이 [0]에 위치하게 되었을 것이다.
이것을 gcd
라는 변수에 저장해주자.
그리고 M[0]을 제외하고 인덱스를 사용해 gcd함수를 사용해 최대공약수를 구하며 최대공약수를 갱신해준다.
gcd = M[0]
for i in range(1, len(M)-1):
gcd = math.gcd(gcd, M[i])
이러면 최대공약수는 구해진 셈으로 해당 최대공약수의 약수만 구하면 된다.
결과라는 의미의 result
리스트를 만들어주고 반복문을 사용해 gcd
의 약수들을 구해줄 것이다. 그런데 이 수의 범위는 1 <= 수 <=1,000,000,000
이렇다. 따라서 이 큰 수를 반복한다면 시간초과에 걸릴 수 밖에 없다.
하지만 시간을 줄이는 방법이 있다.
18이라는 수를 2로 나누었을 경우에는 나머지가 0이되어 2가 약수가 될 수 있다. 하지만 그 나눈 수 2 말고도, 나눈 몫 9도 약수가 된다.
이 점을 이용하면 연산을 반으로 줄일 수 있다.
math.sqrt(gcd)
로 최대공약수의 제곱근을 구해주고 정수형으로 바꿔준 후 1을 더한 범위까지 반복문을 실행하면 시간초과를 면할 수 있다.
약수들을 구해준 뒤에 자기 자신도 append 해주는 것도 까먹지 말자.
for i in range(2, int(math.sqrt(gcd)) + 1):
if gcd % i == 0:
result.append(i)
result.append(gcd // i)
result.append(gcd)
이렇게 구하고 나서 중복되는 값들을 set
를 사용해 제거해준 뒤에 sorted()
로 정렬해주고 출력의 끝을 공백으로 두고 출력해주면 끝이다!
for i in sorted(set(result)):
print(i, end = " ")
import sys
import math
N = int(sys.stdin.readline())
nums = []
for i in range(N):
nums.append(int(sys.stdin.readline()))
M = []
for i in range(len(nums)-1):
M.append(abs(nums[i] - nums[i+1]))
M.sort()
gcd = M[0]
for i in range(1, len(M)-1):
gcd = math.gcd(gcd, M[i])
result = []
for i in range(2, int(math.sqrt(gcd)) + 1):
if gcd % i == 0:
result.append(i)
result.append(gcd // i)
result.append(gcd)
for i in sorted(set(result)):
print(i, end = " ")
문제 푼 날짜 | 체크 |
---|---|
2022-08-01 | ✔ |
파일 및 폴더 생성
파일 시스템 탐색
도움말(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!!] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!