업그레이트 (UpGreate)

- 威武不屈


  • Home

  • Categories

  • About

  • Archives

  • Tags

  • Search

SW Expert Academy - D2_1859

Posted on 2019-08-10 | In ALGORITHM

D2_1859. 백만 장자 프로젝트

문제:

25년 간의 수행 끝에 원재는 미래를 보는 능력을 갖게 되었다. 이 능력으로 원재는 사재기를 하려고 한다.

다만 당국의 감시가 심해 한 번에 많은 양을 사재기 할 수 없다.

다음과 같은 조건 하에서 사재기를 하여 최대한의 이득을 얻도록 도와주자.

  1. 원재는 연속된 N일 동안의 물건의 매매가를 예측하여 알고 있다.
  2. 당국의 감시망에 걸리지 않기 위해 하루에 최대 1만큼 구입할 수 있다.
  3. 판매는 얼마든지 할 수 있다.

예를 들어 3일 동안의 매매가가 1, 2, 3 이라면 처음 두 날에 원료를 구매하여 마지막 날에 팔면 3의 이익을 얻을 수 있다.

입력:

테스트 케이스 수 T

테스트 케이스 별 N(2<=N<=1,000,000)

각 날의 매매가를 나타내는 N개의 자연수 들이 공백으로 구분되어 나타난다.(매매가<=10,000)

출력:

ex) 최대 이익 출력

#1 0 #2 10 #3 5

생각한 로직:

  • 최대 이익을 내야 하니까 도표처럼 생각을 해서 지금 수보다 더 큰수를 찾을때까지 뒤로 탐색 찾으면 그 차이를 더한다. 이것을 모두 반복해야 하니까 n^2의 시간이 걸릴듯 (그래서 fail runtime error 30)
  • 패턴으로 생각해보니 최대값을 찾고 그 전까지 다 더하고 그 다음 피크를 찾고 그 전까지 찾고 더해서 리턴
다른사람 풀이:
  • 사는건 상관 없지만 파는건 최대 값이 나오면 팔아야 함으로 뒤에서 부터 파는게 쉽다.

코딩:

  • 재귀함수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def findpeek(arr,st,end):
    if st == end:
        return 0
    result = 0
    mx = max(arr[st:end])
    # print(mx,result)
    for idx in range(st,end):
        # print(idx)
        if arr[idx] == mx:
            # print(mx, result)
            return result+findpik(arr,idx+1,end)
        result += mx - arr[idx]

T = int(input())
for tc in range(1,T+1):
    N = int(input())
    arr = list(map(int,input().split()))
    print("#{} {}".format(tc,findpeek(arr,0,N)))
  • 다른사람 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
T = int(input())
for tc in range(1, T+1):
    N = int(input())
    arr = list(map(int, input().split()))
    money = list(reversed(arr))
    maxprice = money[0]
 
    res = 0
    for i in range(N):
        if money[i] < maxprice:
            res += maxprice - money[i]
        else:
            maxprice = money[i]
 
    print("#{} {}".format(tc, res))
Read more »

python_self

Posted on 2019-08-09 | In LANGUAGE

인스턴스 속 변수 찾아가기

  • 인스턴스 내부 → 클래스 객체 내부 → 전역공간

Self : 자기 자신을 강조하는 의미의 self (첫번째 인자위치에 예약된 자리)

멤버 메소드는 def 키워드를 사용하고

첫번째 매개변수(인자)는 예약된 자리에 self라는 단어로 사용합니다.

Read more »

SW Expert Academy - D2_1288

Posted on 2019-08-09 | In ALGORITHM

D2_1288. 새로운 불면증 치료법

문제:

민석이는 불면증에 걸렸다. 그래서 잠이 안 올 때의 민간요법 중 하나인 양 세기를 하려고 한다.

민석이는 1번 양부터 순서대로 세는 것이 재미없을 것 같아서 N의 배수 번호인 양을 세기로 하였다.

즉, 첫 번째에는 N번 양을 세고, 두 번째에는 2N번 양, … , k번째에는 kN번 양을 센다.

이렇게 숫자를 세던 민석이에게 잠은 더 오지 않고 다음과 같은 궁금증이 생겼다.

이전에 셌던 번호들의 각 자리수에서 0에서 9까지의 모든 숫자를 보는 것은 최소 몇 번 양을 센 시점일까?

예를 들어 N = 1295이라고 하자.

첫 번째로 N = 1295번 양을 센다. 현재 본 숫자는 1, 2, 5, 9이다.

두 번째로 2N = 2590번 양을 센다. 현재 본 숫자는 0, 2, 5, 9이다.

현재까지 본 숫자는 0, 1, 2, 5, 9이다.

세 번째로 3N = 3885번 양을 센다. 현재 본 숫자는 3, 5, 8이다.

현재까지 본 숫자는 0, 1, 2, 3, 5, 8, 9이다.

네 번째로 4N = 5180번 양을 센다. 현재 본 숫자는 0, 1, 5, 8이다.

현재까지 본 숫자는 0, 1, 2, 3, 5, 8, 9이다.

다섯 번째로 5N = 6475번 양을 센다. 현재 본 숫자는 4, 5, 6, 7이다.

현재까지 본 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9이다.

5N번 양을 세면 0에서 9까지 모든 숫자를 보게 되므로 민석이는 양 세기를 멈춘다.

입력:

  1. 테스트 케이스 T
  2. N (1 ≤ N ≤ 10^6)

출력:

ex)

#1 10 #2 90 #3 110 #4 6475 #5 5076

생각한 로직:

  • 사용한 숫자들은 따로 리스트에 저장을 해놓고 그 리스트 크기가 10이 되는 시점을 찾는다.

코딩:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for tc in range(1,int(input())+1):
    N = int(input())
    cnt=0
    N2=N
    used=list()
    while len(used)!=10:
        cnt += 1
        N2 = N * cnt
        # print(N2)
        tmp=list(str(N2))
        for item in tmp:
            if item not in used:
                used.append(item)
    # print()
    print("#{} {}".format(tc,cnt*N))
Read more »

python_private_멤버

Posted on 2019-08-08 | In LANGUAGE

Private 멤버 변수 정의

  • 클래스 내부 멤버변수 中 숨기고 싶은 변수에 사용한다.

※ class 내부 변수는 public 성격으로 마음대로 접근, 변경이 가능하지만 private 변수는 외부에서 변경이 어렵게 이름을 변경한다. (Name Mangling)

_* : 모듈(파일) 안에서 _로 시작하는 식별자를 정의하면 다른파일에서 접근 할 수 없다.

*_ __ _ ** : 앞,뒤로 _ _ 가 있는 식별자는 시스템에서 정의한 이름이다.

_ _* : 클래스 안에서 외부로 노출되지 않는 식별자로 인식한다.

Read more »

SW Expert Academy - D2_1285

Posted on 2019-08-08 | In ALGORITHM

D2_1285. 아름이의 돌 던지기

문제:

아름이를 포함하여 총 N명의 사람이 돌 던지기 게임을 하고 있다.

이 돌 던지기 게임은 앞으로 돌을 던져 원하는 지점에 최대한 가깝게 돌을 던지는 게임이다.

정확하게 말하면 밀리미터 단위로 -100,000에서 100,000까지의 숫자가 일렬로 써져 있을 때, 사람들은 숫자 100,000이 써져 있는 위치에 서서 최대한 0에 가까운 위치로 돌을 던지려고 한다.

N명의 사람들이 던진 돌이 떨어진 위치를 측정한 자료가 주어질 때, 가장 0에 가깝게 돌이 떨어진 위치와 0 사이의 거리 차이와 몇 명이 그렇게 돌을 던졌는지를 구하는 프로그램을 작성하라.

입력:

  1. 테스트 케이스 T
  2. 돌을 던지는 사람 수 N(1<=N<=1000)
  3. 돌이 떨어진 위치를 나타내는 N개 정수 공백으로 구분되어 주어진다. (-100,000<= 돌 떨어진 위치 <= 100000)

출력:

ex)

#1 100 2 #2 1 1

생각한 로직:

  • 가깝게 던진 거리와 그렇게 던진 사람이 몇명인지 나타내는 정수
  • 좌표에서 표현되는 양수 음수에 상관없이 절대값 크기가 곧 거리와 같고 그러한 사람이 몇명인지만 세면 되겠다.

코딩:

1
2
3
4
5
6
7
8
9
10
11
12
13
for tc in range(1,int(input())+1):
    N = int(input())
    arrlist=list(map(int,input().split()))
    # print(arrlist)
    # 거리가 제일 작은 값을 찾고 그것을 센다.
    length = abs(arrlist[0])
    result = 0
    for item in arrlist:
        if length > abs(item):
            length = abs(item)
    result += arrlist.count(length)
    result += arrlist.count(-1*length)
    print("#{} {} {}".format(tc,length,result))
Read more »
1 … 22 23 24 … 32
Sik

Sik

156 posts
7 categories
30 tags
RSS
© 2021 Sik
Powered by Jekyll
Theme - NexT.Muse