내 풀이

 

import sys
from collections import deque

input = sys.stdin.readline

def solution():
    N,M = map(int,input().split())
    graph=[i for i in range(101)]
    visited = [0] * 101
    for i in range(N+M):
        a,b = map(int,input().split())
        graph[a]=b
    def bfs():
        queue = deque([1])
        visited[1] = 1

        while queue:

            x = queue.popleft()
            print(x)

            for i in range(1,7):
                dice = x + i

                if dice > 100:
                    continue

                cnt = graph[dice]

                if visited[cnt]==0:
                    queue.append(cnt)
                    visited[cnt] = visited[x] + 1

                    if cnt == 100:
                        return
    bfs()
    print(visited[100]-1)
solution()

BFS로 풀어봤다.

포인트는, graph에다가 이동하는 숫자만큼 배분하는것이다.

가령 4에 78로 움직이는 사다리가 있다고 가정하면

graph[4] = 78로 대체하는것이다. 그 외에는 해당 숫자에 맞는 크기를 배분해준다.

배분된 숫자에 주사위 크기만큼 (1~6) 더해주고 그 크기가 100을 넘어간다면 continue를 통해 무시해준다. 

주사위 자체가 1~6까지 for 문으로 돌아가기 때문에

x+1~x+6,까지는 visited[x]의 값이 같을 수 밖에 없다. 

최초에 visited[1]= 1 로 시작하기 때문에 마지막에 -1을 해준다.

참고로 print(x) 주석처리 해줘야 오류 안뜬다.


다른사람의 풀이

 

from collections import deque

def bfs():
    queue = deque([1])
    visited[1] = True
    while queue:
        now = queue.popleft()
        for move in range(1,7):
            check_move = now+move
            if 0 < check_move <= 100 and not visited[check_move]:
                if check_move in ladder.keys():
                    check_move = ladder[check_move]

                if check_move in snack.keys():
                    check_move = snack[check_move]

                if not visited[check_move]:
                    queue.append(check_move)
                    visited[check_move] = True
                    board_cnt[check_move] = board_cnt[now] + 1



if __name__ == '__main__':
    N, M = map(int,input().split())
    board_cnt = [0] * 101
    visited = [False] * 101

    snack = dict()
    ladder = dict()
    for _ in range(N):
        i,j = map(int,input().split())
        ladder[i] = j
    for _ in range(M):
        i,j = map(int,input().split())
        snack[i] = j

    bfs()
    print(board_cnt[100])

딕셔너리를 이용하여 풀었다. 기본적인 접근자체는 비슷한거 같다. 근데 이렇게하면 처리를 각각해줘야 되니 귀찮을거 같다.


 

'취준 > 백준' 카테고리의 다른 글

16326 - 파이썬  (0) 2022.08.02
1707 - 파이썬  (0) 2022.08.02
1504 - 파이썬  (0) 2022.07.27
7569 - 파이썬  (0) 2022.07.26
7576 - 파이썬  (0) 2022.07.14

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

 

2004번: 조합 0의 개수

첫째 줄에 정수 $n$, $m$ ($0 \le m \le n \le 2,000,000,000$, $n \ne 0$)이 들어온다.

www.acmicpc.net


 
a,b = map(int,input().split())

def count_two(N):
     two=0
     while N!=0:
          N//=2
          two +=N
     return two

def count_five(N):
     five=0
     while N!=0:
          N//=5
          five+=N
     return five


two = count_two(a)-count_two(a-b)-count_two(b)
five = count_five(a)-count_five(a-b)-count_five(b)

print(min(two,five))
 

막무가내로 풀면 무조건 시간초과 메모리초과가 난다.

쓸수있는 방법을 다 써보다 안돼서 앞서 1676번에서 봤던 깔끔한 코드를 이용해보기로 했다.

 

https://playedenough.tistory.com/55?category=1050629 

 

1676 - 백준

https://www.acmicpc.net/problem/1676 1676번: 팩토리얼 0의 개수 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. www.acmicpc.net import sys from math imp..

playedenough.tistory.com

 

간단하게 설명을 하자면,

만약 어떤 수 N이 0을 포함하고 있다면 그 형태는 반드시

10^N X A 일것이다.

근데 10^N을 인수분해하게 되면 2^N X 5^N 의 형태이다. 그런데 A안에도 2나 5가 포함 되어질 수도 있어서

2^N X 5^N X A 의 형태가 2^N X 5^(N+K) X A 혹은 2^(N+K) X 5^N X A 의 형태로 나타내 질 수도 있다.   

예를들어서

1320 = 13200 = 132 X 10^2 = 132 X (2^2 X 5^2) 형태를 띄게 된다.

근데 여기서 132을 인수분해하면 132 = 66 X 2 = 33 X 2 X 2 = 3 X 2^2 X 11 이므로

최종적으로는 3 X 11 X (2^4 X 5^2) 형태를 띄게 된다.

그렇기에 우리는 2와 5의 지수중에 최소값을 선택하면 그게 곧 10의 개수이고 이는 곧 0의 개수라고 생각할 수 있다.

13200 = 3 X 11 X (2^4 X 5^2) -> min(2의지수,5의지수) = 2 13200 에서 0의 개수는 2개.

 

 

이를 생각해냈다면 그 다음부터는 단순히 nCr 조합 공식을 사용하면된다.

nCr 공식

예를들어서

25C12 를 구한다고하면

25! / (25-12)! * 12! 이다.

25 ! = ( 1 x 2 x 3 x 4 x ....... 21 x 22 x 23 x 24 x 25) 

(25-12) ! = (1 x 2 x ................ x 11 x 12 x 13)

12 ! = ( 1 x 2 x ....................... x 11 x 12)

이다.

2와 5의 개수는 def count를 통해서 쉽게 알 수 있다.

근데 여기서 주의해야할게 100! 과 같은 경우에 5의 개수를 구해보면

5의 배수에서 하나씩  (5,10,15....100) 총 20개

5^2의 배수에서는 하나씩 더  (25, 50, 75,100) 총 4개를 더 가지고 있다.

숫자가 더 커지게 되어서 5^n의 배수일때도 고려해줘야 된다.

n!에서 5의 지수승의 총합 = n/5 + n/25 + n/75 + ...... 이런 형태를 띄게된다.

이는 2의 배수에서도 마찬 가지임을 주의해야한다.

 

또 여기서 a-(a-b)-b 를 하는 이유는 나누기 때문이다.

엄밀히 말하면 (a-{(a-b)+b)} 이다. 

예를들어서 120/2x12를 한다고 하면 에서 2의 개수는

120 / 24 = 5

120 = 12 x 10 = 2^2 x 3 x 2 x 5 = 2^3 x 3 x 5

2x12 = 2^1 x 2^2 x 3 = 2^3 x 3

2^3 x 3 x 5 / 2^3 x 3 

= 5

2^2 / 2 = 2^2-1 = 2^1 이렇게 나타낼 수 있으니까라고 생각하면 된다.

 

 

 

 

 

 

 

'취준 > 백준' 카테고리의 다른 글

18352 - 파이썬  (0) 2022.07.07
2178 - 파이썬  (0) 2022.07.05
1676 - 백준  (0) 2022.05.11
9375 - 파이썬  (0) 2022.05.09
11051 - 파이썬  (0) 2022.05.06

 

나 분명히 고등학교 때 수학 잘했는데 이항계수가 뭔지 기억이 안났다. 찾아보니 콤비네이션이였다.

그냥 콤비네이션 구하면 되는거였음.

근데 포인트는 시간제한이다.

보자마자 dp로 풀면되겠다는 생각을했고 그런대로 잘 푼거 같다. 


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


 

import sys
input = sys.stdin.readline


a,b = map(int,input().split())
dp=[[0 for _ in range(a+1)] for _ in range(a+1)]

for i in range(0,a+1):
        for j in range(0,a+1):
                if j==0:
                        dp[i][j]=1
                elif j==i:
                        dp[i][j]=1
                elif j==1:
                        dp[i][j]=i
                elif a>=b:
                        dp[i][j]=dp[i-1][j]+dp[i-1][j-1] 


print(dp[a][b]%10007)

'취준 > 백준' 카테고리의 다른 글

1676 - 백준  (0) 2022.05.11
9375 - 파이썬  (0) 2022.05.09
3036 - 파이썬  (0) 2022.05.06
2981 - 파이썬  (0) 2022.05.05
9184 - 파이썬  (0) 2022.05.03

되게 힘들고 멍청한 방법으로 풀었다.

근데 나중에 생각해보니까 기약분수는 최대공약수로 나누면 쉽게 만들 수 있다는걸 깨달았다

고로 멍청한 방법 1 과 현명한 방법 2를 소개한다.


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

 

3036번: 링

출력은 총 N-1줄을 해야 한다. 첫 번째 링을 제외한 각각의 링에 대해서, 첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 기약 분수 형태 A/B로 출력한다.

www.acmicpc.net


1.

import sys
import fractions
import copy
input = sys.stdin.readline


N = int(input())
A=list(map(int,input().split()))
B=copy.deepcopy(A)

for i in range(1,N):

    if A[0] % A[i] ==0:
         A[0] = int(A[0]/A[i])
         A[i] = int(A[i]/A[i])
         print(f'{A[0]}/{A[i]}')
         A[0]=B[0]
         

    else:
        print(fractions.Fraction(A[0],A[i]))

 

2.

import sys
import math
input = sys.stdin.readline


N = int(input())
A=list(map(int,input().split()))
for i in range(1,N):
     g=math.gcd((A[0]),A[i])
     qnswk =int(A[0] / g)
     qnsah =int(A[i] / g)
     print(f'{qnswk}/{qnsah}')
         
         
   
1번 방법의 핵심은 깊은복사(deepcopy)이다. 단순하게 A=B 형태로 복사하면 얕은복사(Shallow Copy)가 이루어져 원본 데이터에도 영향이 있어서 복사를 하나마나 한 결과를 도출한다. 고로 copy 모듈을 이용해서 깊은복사를 하는게 포인트이다. 그치만 멍청하고 돌아가는 방법이니까 이렇게 하지는 않기를 강력 권장한다.
 
2번 방법의 핵심은 기약분수를 어떻게 만드느냐인데, 최대공약수로 나눠주면 된다.
 

'취준 > 백준' 카테고리의 다른 글

9375 - 파이썬  (0) 2022.05.09
11051 - 파이썬  (0) 2022.05.06
2981 - 파이썬  (0) 2022.05.05
9184 - 파이썬  (0) 2022.05.03
1003 - 파이썬  (0) 2022.05.03

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

 

2981번: 검문

트럭을 타고 이동하던 상근이는 경찰의 검문을 받게 되었다. 경찰은 상근이가 운반하던 화물을 하나하나 모두 확인할 것이기 때문에, 검문하는데 엄청나게 오랜 시간이 걸린다. 상근이는 시간

www.acmicpc.net

 

 

정말 오래 고민했다.

결국 인터넷을 보고 해답을 찾았고 아직 난 멀었다..

 

내가 처음 떠올랐던 방법은 

리스트로 받은 목록중에 가장 작은 값을 범위로 하나하나 씩 다 나누면서 일일이 있나 없나를 확인했다

그 결과 시간초과가 나왔고 진짜 하루이상 고민한거 같은데 결국 모르겠어서 인터넷을 뒤져보았다.


import sys
import math

input = sys.stdin.readline

N = int(input())
A=sorted([int(input()) for _ in range(N)])
ret= []
temp=[]
for i in range(1,N):
     temp.append(A[i] - A[i-1])



gcd_=temp[0]

for i in range(1,len(temp)):
     gcd_=math.gcd(gcd_,temp[i])



for i in range(2,int(gcd_**0.5) +1):
     if gcd_ % i ==0:
          ret.append(i)
          ret.append(gcd_//i)

ret.append(gcd_)

for i in sorted(set(ret)):
     print(i,end='\n')

다른 블로그에 찾아보면 자세한 해답이 나와있겠지만 대충 방법을 말해보자면
 

R= [ 입력받은 리스트 ]

R[0]= A X M + R  
R[1]= B X M + R
R[2]= C X M + R
 
공통적으로 가진 인수는 M 과 R이다. 

 

R[0] - R[1] = (A - B) X M
R[1] - R[2] = (B - C) X M 
 
이런식으로 나타낼 수 있다.
위 식은 아래식과 같은 형태를 띄고 있는데
1 X 3 = 3
2 X 3 = 6
3 X 3 = 9... 여기서 3은 3 6 9 의 최대 공약수이다.
고로 우리는 R[0] - R[1] , R[1] - R[2]  ...이 친구들의 최대 공약수를 찾으면 M을 찾을 수 있는 것이다.
마지막으로 결과를 append할 때 for문을 끝까지 돌려서 append 할 수도 있겠지만 그렇게 되면 시간초과가 난다.
그래서 for 문을 루트까지만 돌려서 한개의 결과값을 append 하고 나머지 값은 그 친구를 나눈값을 append 하면 된다.
가령 8 = 2 X 4 로 나타낼 수 있는데 2와 곱해지는 수를 찾을때는 8 // 2 (=4) 를 하면 찾을 수 있음을 알 수 있다. 
 

 

 

'취준 > 백준' 카테고리의 다른 글

11051 - 파이썬  (0) 2022.05.06
3036 - 파이썬  (0) 2022.05.06
9184 - 파이썬  (0) 2022.05.03
1003 - 파이썬  (0) 2022.05.03
14889 - 파이썬  (0) 2022.05.02

파이썬?

문법이 매우 쉬워서 작성하기에 간단하기 때문에 초보자들이 처음 프로그래밍을 배울 때 추천되는 언어이다. 오죽하면 파이썬의 별명이 "실행할 수 있는 의사 코드(Executable pseudocode)"일 정도. 실제로도 미국 공과 대학교에서 컴퓨터 프로그래밍 입문 수업으로 파이썬을 많이 사용하기도 한다. 학습용으로 좋은 언어인 동시에 실사용률과 생산성도 높은 강력한 언어인 셈 by 나무위키

 


그렇다 파이썬의 가장 큰 장점은 직관적이다.

수도 코드와 가장 유사하기 때문에 알고리즘 문제를 풀 때 많이들 이용하는 언어이다.

근데 이런 파이썬을 이용하다보면 가장 큰 문제는 느린 속도이다.

https://dl.acm.org/doi/abs/10.1145/3136014.3136031

 

Energy efficiency across programming languages: how do energy, time, and memory relate? | Proceedings of the 10th ACM SIGPLAN In

ABSTRACT This paper presents a study of the runtime, memory usage and energy consumption of twenty seven well-known software languages. We monitor the performance of such languages using ten different programming problems, expressed in each of the language

dl.acm.org

에 따르면 c언어에 비해 약 72배 정도 느리다고 한다.

왜 느린가? 를 얘기하자면 파이썬은 인터프리터 방식으로 코드를 한줄 씩 바로바로 해석한다.

그에 비해 c언어는 전체를 컴파일 한 후 통째로 실행시켜버린다.

이에 관한 자세한 내용은 아래블로그를 참고하길 바란다.

https://hitzi.tistory.com/31

 

파이썬이 느린 이유

파이썬은 C언어나 기타 저급 언어에 비해서 느리다는 소리를 많이 들었다. 예전에 왜 그런걸까 궁금해서 검색해보았더니, 한 질답 사이트에서 파이썬은 인터프리터 언어고, 저급언어는 컴파일

hitzi.tistory.com

각설하고, 그래서 pypy 뭔데 빠르냐? 이게 궁금했다. 사실 학교 동기가 크림이라는 회사에 지원했는데 인터뷰에서 이걸 물어 봤다고 한다. 사실 나는 파이썬으로는 코딩테스트만 치고 넘어갈꺼지만 갑자기 궁금했기 때문에 찾아보았다.

답은 stackoverflow에서 간단히 찾을 수 있었다.

https://stackoverflow.com/questions/59050724/whats-the-differences-python3-and-pypy3

 

what's the differences python3 and pypy3

Today I knew that pypy3 is faster than python3 for input() time through any algorithm problem. Performance differences were almost as much as 12 times. Why is there such a difference?

stackoverflow.com

 

Kindly check this, when we speak of Python programming language we often mean not just the language but also the implementation. Python is a specification for a language that can be implemented in many different ways.

The default implementation of the Python programming language is Cpython(assuming python3 you mean Cpython). As the name suggests Cpython is written in C language. Cpython compiles the python source code into intermediate bytecode, which is executed by the Cpython virtual machine.

Jython is an implementation of the Python programming language that can run on the Java platform. Jython programs use Java classes instead of Python modules. Jython compiles into Java byte code, which can then be run by Java virtual machine.

PyPy If you want your code to run faster, you should probably just use PyPy. — Guido van Rossum (creator of Python) Python is a dynamic programming language. Python is said to be slow as the default CPython implementation compiles the python source code in bytecode which is slow as compared to machine code(native code). Here PyPy comes in.

PyPy is an implementation of the Python programming language written in Python. The Interpreter is written in RPython (a subset of Python). PyPy uses Just In Time (JIT) compilation. In simple terms, JIT uses compilation methods to make the interpreter system more efficient and fast. So basically JIT makes it possible to compile the source code into native machine code which makes it very fast. PyPy also comes with default support for stackless mode, providing micro-threads for massive concurrency. It is said to be approximately 7.5 times faster than Cpython.

 

그래서 오늘의 결론

 

파이파이(PyPy)는 파이썬으로 작성된 파이썬 프로그래밍 언어이다. 인터프리터는 RPython(파이썬의 하위 집합)으로 작성된다. PyPy는 JIT(Just In Time) 컴파일을 사용한다. JIT는 컴파일 방법을 사용하여 시스템을 더 효율적이고 빠르게 만든다. 따라서 기본적으로 JIT는 소스 코드를 네이티브 머신 코드로 컴파일하는 것이 가능하다.

그러한 이유로 python에 비해 pypy가 더 빠르다.


 

*컴파일과 인터프리터 방식의 차이점

https://chayan-memorias.tistory.com/96

 

프로그래밍 언어론 1-4강. Compilation(편집) vs Interpretation(해석)

[Pure Compilation(컴파일) 실행구조] (컴파일러 : 컴파일 통제 위치(locus of control) , 목표 프로그램 : 자체적(목표 프로그램) 실행 통제 위치) : 컴파일러가 고레벨의 원본 프로그램을 목표 프로그램으

chayan-memorias.tistory.com

 

 

+ Recent posts