문제:

Lucky Set이란 정수의 집합이다.

구간 [A,B]란 A보다 크거나 같고, B보다 작거나 같은 모든 정수가 있는 구간이다. 이때, A와 B는 모두 양수이고, B는 A보다 크다.

구간 [A,B]가 Unlucky가 되기 위해선 구간에 속한 모든 정수가 Lucky Set에 없어야 한다.

Lucky Set과 N이 주어질 때, N을 포함하는 Unlucky 구간의 개수를 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 Lucky Set에 포함된 숫자의 개수 L이 주어진다. 둘째 줄에는 L개의 수가 주어진다. 이 수는 1,000보다 작거나 같은 자연수이고, L은 50보다 작거나 같은 자연수이다. 그리고 중복되지 않는다. 마지막 줄에는 N이 주어진다. N은 lucky Set에서 가장 큰 수보다 작거나 같은 자연수이다.

출력:

첫재 줄에 문제의 정답을 출력한다.

풀이방법:

N이 Lucky set의 어느 구간에 속해 있는지 파악해야 한다. 이 때, N이 lucky set의 원소일 수 있으므로 주의해서 탐색해야 한다. 반복문을 사용해서 N이 속해 있는 구간을 파악하고 왼쪽 값을 left, 오른쪽 값을 right라고 설정한다. N이 lucky set의 원소보다 다 작은 경우는 예외케이스로 판단하도록 한다.

left 와 right를 구한 뒤에는 이중반복문을 사용해서 구간을 생성하여, 이 구간 내에 N이 있는 경우에만 answer에 값을 더하도록 한다.

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
= int(input())
lucky = list(map(int,input().split()))
lucky.sort()
answer = 0
= int(input())
left,right = 00
if N<lucky[0]:
    left=0
    right=lucky[0]
elif N == lucky[0]:
    pass
else:
    for i in range(1,len(lucky)):
        if N == lucky[i]:
            break
        elif lucky[i-1< N and lucky[i] > N:
            left = lucky[i-1]
            right = lucky[i]
            break
            
if left+right==0:
    print(answer)
else:
    for l in range(left+1,right):
        for r in range(l+1,right):
            if l<=N<=r:
                answer+=1
    print(answer)
cs

문제링크:

www.acmicpc.net/problem/1059

 

1059번: 수2

첫째 줄에 Lucky Set에 포함된 숫자의 개수 L이 주어진다. 둘째 줄에는 L개의 수가 주어진다. 이 수는 1,000보다 작거나 같은 자연수이고, L은 50보다 작거나 같은 자연수이다. 그리고 중복되지 않는다

www.acmicpc.net

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1992. 쿼드트리  (0) 2020.11.17
[BOJ]1041. 주사위  (0) 2020.11.12
[BOJ]10775. 공항  (0) 2020.10.29
[BOJ]1786. 찾기  (0) 2020.10.27
[BOJ]19948. 음유시인 영재  (0) 2020.10.15

문제:

수현이는 4차 산업혁명 시대에 살고 있는 중학생이다. 코로나 19로 인해, 수현이는 버추얼 학교로 버추얼 출석해 버추얼 강의를 듣고 있다. 수현이의 버추얼 선생님은 문자가 2개인 연립방정식을 해결하는 방법에 대해 강의하고, 다음과 같은 문제를 숙제로 냈다.

 

다음 연립 방정식에서 x와 y의 값을 계산하시오.

4차 산업혁명 시대에 숙제나 하고 앉아있는 것보다 버추얼 친구들을 만나러 가는 게 더 가치있는 일이라고 생각했던 수현이는 이런 연립방정식을 풀 시간이 없었다. 다행히도, 버추얼 강의의 숙제 제출은 인터넷 창의 빈 칸에 수들을 입력하는 식이다. 각 칸에는 -999 이상 999 이하의 정수만 입력할 수 있다. 수현이가 버추얼 친구들을 만나러 버추얼 세계로 떠날 수 있게 도와주자.

입력:

정수 a,b,c,d,e,f가 공백으로 구분되어 차례대로 주어진다. (-999<=a,b,c,d,e,f<=999)

문제에서 언급한 방정식을 만족하는 (x,y)가 유일하게 존재하고, 이 때 x와 y사 각각 -999 이상 999 이하의 정수인 경우만 입력으로 주어짐이 보장된다.

출력:

문제의 답인 x와 y를 공백으로 구분해 출력한다.

풀이방법:

연립방정식을 푸는 방법은 보통 가감법을 많이 사용한다. 따라서 가감법을 사용해서 x와 y에 대한 식을 계산하면 다음과 같이 정리되고, 해당하는 값을 넣어주면 값이 나올 것이다. 답은 항상 정수이기 때문에 // 를 사용했다.

1
2
3
4
a,b,c,d,e,f = map(int,input().split())
= (c*e-b*f)//(a*e-b*d)
= (c*d-a*f)//(b*d-a*e)
print(x,y)
cs

다른 방법으로는 방정식을 만족하는 해가 유일하게 하나 존재하고, -999~999 사이의 정수라는 조건이 있다. 따라서 반복문을 통해서 모든 값에 대해 체크를 하는 방식으로도 답을 구할 수 있다.

1
2
3
4
5
6
a,b,c,d,e,f = map(int,input().split())
for x in range(-999,1000):
    for y in range(-999,1000):
        if (a*x+b*y)==and (d*x+e*y)==f:
            print(x,y)
            break
cs

문제링크:

https://www.acmicpc.net/problem/19532

 

19532번: 수학은 비대면강의입니다

정수 $a$, $b$, $c$, $d$, $e$, $f$가 공백으로 구분되어 차례대로 주어진다. ($-999 \leq a,b,c,d,e,f \leq 999$) 문제에서 언급한 방정식을 만족하는 $\left(x,y\right)$가 유일하게 존재하고, 이 때 $x$와 $y$가 각각 $-

www.acmicpc.net

 

'Algorithm > Python' 카테고리의 다른 글

[Programmers]2020 Kakao. 자물쇠와 열쇠  (0) 2020.08.11
[BOJ]2493. 탑  (0) 2020.08.06
[BOJ]2580. 스도쿠  (0) 2020.07.30
[BOJ]17362  (0) 2020.07.28
[BOJ]18258. 큐2  (0) 2020.07.23

문제:

당신은 FCFS(First-Come, First-Served)의 규칙에 따라 요청된 일을 처리하는 서버를 담당하게 되었다. 매일, 당신은 일을 처리하기 위해 최대 T분 동안 서버에 시간을 할당할 수 있다. 당신은 오늘 주어진 시간동안 몇개의 일이 완료될 수 있는지 알고 싶다.

예시를 들어보겠다. T=180이고, 요청된 일들의 수행시간이 요청된 순으로 45,30,55,20,80,20 분이다. 그러면, 단 4개의 일만이 완료될 수 있다. 처음 4개의 일의 수행시간은 150분으로 주어진 시간 내에 완료될 수 있지만, 처음 5개의 일의 수행시간은 230분으로 주어진 시간 180분보다 크기 때문에 완료될 수 없다. 처음 4개의 일을 수행한 뒤 6번째의 일을 수행해도 T를 초과하지 않지만 5번째 일을 수행할 수 없기 때문에 6번째 일을 수행할 수 없음을 참고해라.

입력:

첫 줄을 두 정수 n과 T이며 (1<=n<=50, 1<=T<=500) n은 일의 개수를 나타낸다. 두 번째 줄은 n개의 100이하의 자연수가 입력되며, 입력된 각 일의 수행 시간을 나타낸다.

출력:

일이 First-come, First-serverd 규칙에 따라 처리될 때, T분 안에 완료될 수 있는 일들의 개수를 출력하라.

풀이방법:

앞에서 부터 더하면서 T를 넘는지 확인하면 된다. T를 넘는다면 break를 걸고 나와서 그 때까지의 값을 출력하면 된다. idx<n이라는 조건이 있는데 이 것은 주어진 일을 모두 T 시간 내에 해결할 수 있을 때 발생하는 에러에 대한 조건이다. while문을 사용했기 때문에 T가 아직 남아 있다면 계속해서 반복하게 될 것이고 런타임에러가 발생한다. 따라서 모든 값을 탐색했다면 종료해야 하기 때문에 이 조건을 넣었다.

1
2
3
4
5
6
7
8
9
10
11
12
n,T=map(int,input().split())
works=list(map(int,input().split()))
answer = 0
idx = 0
while T and idx < n:
    if T - works[idx] >= 0:
        answer+=1
        T-=works[idx]
        idx+=1
    else:
        break
print(answer)
cs

문제링크:

https://www.acmicpc.net/problem/10409

 

10409번: 서버

문제 당신은 FCFS(First-Come, First-Served)의 규칙에 따라 요청된 일을 처리하는 서버를 담당하게 되었다. 매일, 당신은 일을 처리하기 위해 최대 T분 동안 서버에 시간을 할당할 수 있다. 당신은 오늘 주어진 시간동안 몇개의 일이 완료될 수 있는지 알고싶다. 예시를 들어보겠다. T = 180이고, 요청된 일들의 수행시간이 요청된 순으로 각각 45, 30, 55, 20, 80, 20분이다. 그러면, 단 4개의 일만이 완료될 수 있다.

www.acmicpc.net

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]10815. 숫자카드  (0) 2019.12.13
[BOJ]2033. 반올림  (0) 2019.12.12
[BOJ]5032. 탄산음료  (0) 2019.12.08
[Programmers]Lv 4. 서울에서 경산까지  (0) 2019.12.07
[Programmers]Lv 3. 종이접기  (0) 2019.12.06

문제:

준민이는 탄산 음료를 좋아한다. 탄산 음료를 사느라 돈을 다 써버렸기 때문에, 이제 준민이는 가진 돈이 없어 탄산 음룔를 사먹을 수 없다.

 

준민이는 항상 법을 지키며 사는 사람이기 때문에, 아무리 탄산 음료가 먹고 싶어도 훔치지 않는다. 따라서, 법적으로 문제가 없는 방법으로 탄산 음료를 구매할 것이다.

 

마침 빈 병을 특정 개수만큼 가져가면, 새 병으로 바꾸어주는 이벤트가 진행중이다. 준민이는 길에서 빈 병을 열심히 찾은 뒤, 탄산 음료를 먹으려고 한다.

 

준민이가 현재 가지고 있는 빈 병의 수와 길에서 발견한 빈 병의 수, 새 병으로 바꾸는데 필요한 빈 병의 수가 주어졌을 때, 준민이가 탄산 음료를 몇 개 먹을 수 있는지 구하는 프로그램을 작성하시오.

입력:

첫째 줄에 준민이가 가지고 있는 빈 병의 수 e, 그날 발견한 빈 병의 수 f, 새 병으로 바꾸는데 필요한 빈 병의 개수 c가 주어진다. (e<1000, f<1000,1<c<2000)e,f,c는 모두 음이 아닌 정수이다.

출력:

첫째 줄에 준민이가 탄산 음료를 몇 개나 먹을 수 있는지를 출력한다.

풀이방법:

가지고 있는 빈 병이랑 발견한 빈 병의 수도 중요하지만 이를 통해서 구매한 병의 수도 중요하다. 이 문제의 경우처럼 9개의 빈병으로 3개를 바꿀 수가 있다. 그리고 이 3병을 다 마시면 다시 1병을 바꿀 수 있기 때문에 총 4병이 되는 것이다. 그래서 이와 같은 방법으로 몇번을 더 바꾸어 먹을 수 있는지 모르기 때문에 while을 사용하였다.

병의 수를 c로 나누었을 때 몫을 계속해서 더하며 남은 병과 몫을 다시 더해서 빈 병으로 만든다. 

이 과정을 계속해서 반복하면서 몫이 0이 되는 경우에 빠져 나오도록 하였다.

1
2
3
4
5
6
7
8
9
10
e,f,c=map(int,input().split())
answer=0
e+=f
while e:
    p,r=divmod(e,c)
    answer+=p
    if p==0:
        break
    e=p+r
print(answer)
cs

문제링크:

https://www.acmicpc.net/problem/5032

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2033. 반올림  (0) 2019.12.12
[BOJ]10409. 서버  (0) 2019.12.09
[Programmers]Lv 4. 서울에서 경산까지  (0) 2019.12.07
[Programmers]Lv 3. 종이접기  (0) 2019.12.06
[Programmers]Lv 2. 멀쩡한 사각형  (0) 2019.12.05

2019/01/29 - [Language/Python] - [Python 따라하기]1. Python 설치하기

2019/02/05 - [Language/Python] - [Python 따라하기] 2. 자료형_part 1(String, Int,Float, List)

2019/02/12 - [Language/Python] - [Python 따라하기]3. 자료형_part2(Tuple,Set,Dictionary)

2019/02/19 - [Language/Python] - [Python 따라하기]4.조건문

반복문

 같은 작업을 반복적으로 해야할 때, 반복문을 사용한다면 작업의 양이 줄어들 뿐만 아니라 보기에도 깔끔해지게 된다.
반복문에는 크게 for와 while 두 가지가 있다.



For

for는 주로 list 혹은 String과 같이 반복가능한 객체를 한 번씩 훑어보기 위해서 사용한다. for의 구조는 다음과 같다.

for <<variable>> in <<iterable>>:
<<contents>>

if 절과 같이 for 즉 반복적으로 행할 내용들은 for에 속하는 것임을 나타내기 위해서 indentation(들여쓰기)을 설정해둔다.
if 절과 같이 들여쓰기는 스페이스바 4번이나 탭 한번으로 통일하여 사용한다.
variable은 사용자가 임의로 변수를 설정해서 사용하는데 주로 i , j, k .... 순으로 사용하는게 일반적이다.
다음과 같이 iterable에 String 값을 넣으면 한 글자(char)씩 반복하며 진행한다.


Range

for 반복문을 사용할 때 iterable 부분에 list나 String 값을 넣어서 직접 값을 탐색하며 진행을 하기도 하지만 range를 사용해서 인덱스로 접근을 하기도 한다.
range는 range((start),stop,(step))으로 구성되어 있다. start(선택사항)부터 stop(필수적)까지 step(선택사항)씩 연속적인 정수 객체를 만들어 준다.


range 함수로 만들어진 값은 list와 비슷하게 작동을 하지만 range라는 객체를 가지고 있다. 따라서 list에 사용하는 메소드들을 사용하는 것은 불가능 하므로 사용하기 위해서는 list로 변환 후 사용해야 한다.



다음은 range 와 len 함수를 사용해서 인덱스로 배열값들을 접근하는 경우이다. iterable 자리에 list 나 String을 넣어서 직접 값에 접근을 하게 되면 하나의 배열만 반복문을 사용할 수 있지만 다음과 같이 range와 len을 사용하면 길이가 같은 두 개의 배열을 동시에 반복문을 사용할 수 있다.



enumerate

range에선 인덱스로 접근할 수 없다는 단점을 보완하기 위해서 인덱스와 값을 동시에 접근 할 수 있도록 해주는 함수이다.
enumerate(iterable)로 사용을 하며 인덱스와 값을 쌍으로 가지는 튜플값을 하나의 원소로 가지는 enumerate 객체로 반환을 한다.
enumerate((0,iterable[0]),(1,iterable[1]),.....)



이중 반복문

이중 반복문이란 반복문안에 반복문을 사용하는 것으로 주로 행렬을 나타내고자 할 때, 서로 연관있는 두 개의 반복가능한 객체를 동시에 사용하고자 할 때 사용한다.


위처럼 두 개의 반복문을 사용할 때 서로 각각의 variable을 사용해야 하며 first의 한 값당 second가 한 루틴씩 실행됨을 알 수 있다.


또한 들여쓰기에 따라서 실행되는 횟수가 달라지는데 print(i+"번째 중"+j+"번째")는 i와 j 둘다 속해있는 부분이라 총 9번 실행됨을 알 수 있지만

print("---------------")는 i에만 해당하는 부분이므로 3번만 실행됨을 알 수 있다.


While

while 반복문은 내가 얼마나 반복문을 사용해야 할지 정확히 모를 때 사용하거나 중복적인 인덱스 혹은 값을 접근해야 할 경우에 사용한다.


while의 구조는 다음과 같다.


while <<condition>>:

<<contents>>


while은 for와 달리 순차적으로 진행을 하지 않고 condition이 참인 경우에만 while 내의 내용을 반복한다. 이 말은 condition이 거짓이 될 때까지 계속 반복한다는 뜻이다. 따라서 처음에는 condition이 참이어야 while문이 실행이 되지만 contents를 진행하면서 condition이 거짓이 되도록 만들어야 한다. 그렇지 않으면 무한반복에 빠지게 된다. 만약 무한반복에 빠지게 된다면 ctrl+c 혹은 쥬피터를 사용한다면 위의 정지버튼을 누르면 된다.



아래는 탈출 조건이 없으므로 무한반복에 빠지게 된다.



반복문을 더 효율적으로 활용하기 위해서 break와 continue를 사용할 수 있다.


break

반복문 진행중에 이미 원하는 바를 이뤄서 뒤의 진행이 필요가 없을 수 있다. 따라서 더 효율적으로 사용하기 위해 반복문이 한참 진행중이라도 일정 조건을 만나면 반복문이 끝나게 만들어주는 것이 break다. 또한 while에서는 condition이 아직 참이라도 break를 만나면 반복문이 바로 끝내도록 할 수 있다.
break는 다음과 같이 사용한다.

continue

break는 일정 조건을 만나면 반복문을 깨뜨리지만 continue는 일정 조건에서만 반복문이 진행되지 않도록 한다. 반복문 내에서 continue를 만난다면 아직 반복문 내에 남은 내용이 있더라도 작동하지 않고 다음 값으로 넘어간다. continue는 다음과 같이 사용한다.


+ Recent posts