728x90

◯문제 링크

 

[백준/2292]벌집

 

◯코드 미리보기

range = 1
Num= int(input())
multi = 1

while(1):
    if range >= Num:
        print(multi)
        break

    range += 6*multi
    multi += 1

 

◯풀이 과정

먼저 이 문제는 혼자 고민해서 푼 것은 아니다. 이렇다 할 진척없이 몇시간동안 같은 부분에서 막혀있어서 결국 검색을 해서 문제를 풀었다. 

처음 문제를 보고서 한 행동은 패턴을 찾는 일이었다. 그래서 찾은 패턴이 방의 최소 개수의 범위가 1을 초항으로 6n을 계속 더해주는 방식이라는 것이다. 이런 형태를 보는 순간 예전에 열심히 풀었던 수열들이 생각이 나면서 기억을 더듬어서 어떻게든 활용해보려고 노력했다. 그렇게 일반항이 6n인 등차수열의 합의 공식을 찾아내어 적용시키는데 까지 해내었다. 이것이 문제의 서막이었다.

한참을 고민하다 결국 검색을 통해 알게된 사실이지만, 이 문제는 그렇게 거창한 수식이 아니라 간단한 검증식을 반복을통해서 적용시키면 되는 문제였다. 예전에 참가했던 코딩 대회에서 반복문을 사용해서 시간오버가 걸리면서 반복문을 기피하게 되다보니 너무 어렵게 생각했던 것 같다. 

 

◯코드 해설

range = 1
Num= int(input())
multi = 1

→이번 코드에서 사용할 변수들이다. range는 방의 범위를 나타내는 변수이고, num은 입력으로 주어진 방을 저장하는 변수이다. multi는 증가하는 6의 배수를 나타내는 변수이다. 

 

while(1):
    if range >= Num:
        print(multi)
        break

→이번에는 무한 반복을 사용했다. 반복문을 사용한다는 사실이 너무 부담됬는데, 검색을 해보니까 바로 무한반복을 사용을 해서 살짝 놀랐다. 내가 너무 사용하지 않으려고만 생각했던 것 같다.

→if문안은 입력받은 값이 범위를 넘지 않을때 / 지나는 방의 개수를 출력하고 / 반복을 멈추는 코드이다. 이 때 출력되는 값을 그냥 multi변수로 사용 했는데, 처음 multi변수를 선언할 때 값을 1로 주었고 다음에 나오겠지만 if문이 종료되고 값을 증가시키기 때문에 if문 안에서의 multi값은 해당되는 방의 값이랑 동일하기 때문에 그냥 출력했다.

 

    range += 6*multi
    multi += 1

→위에서 if문의 조건에 해당되지 않을경우 실행이 되는 코드들이다. range의 범위를 증가시킨 다음에, multi의 값을 증가 시킨다. 

 

◯배운 점

반복을 무조건 적으로 기피하려고 하지 말 것

 

728x90

'python > 문제' 카테고리의 다른 글

[백준/2869]달팽이는 올라가고 싶다  (0) 2021.01.29
[백준/1193]분수찾기  (0) 2021.01.27
[백준/1712]손익분기점  (0) 2021.01.23
[백준/10951]A+B-4  (0) 2021.01.05
[백준/10952]A+B-5  (0) 2021.01.05
728x90

◯문제 링크

 

[백준/1712]손익분기점

 

코드 미리보기

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

if b>= c:
    print("%d"%(-1))

else :
    n = int((a/(c-b))+1)
    print(n)    

◯설명

예전에 파이썬 문제를 풀다가 시간제한의 늪에 빠져서 멘붕이 온 적이 있었다.

그때 원인이 되었던게 for문 이었어서, 이번 문제를 풀면서 가장 먼저 했던 생각이 '어떻게 하면 반복 없이 구할 수      있을까'였다. 

그렇게 고민을 하다가, 식을 세워 보기로 했다. 

문제에서 나온 조건들은 고정비용(A),가변비용(B),판매비용(C)가 있고, 구해야 하는 답(N)은 구해야 하는 판매대수이다.

우리가 지금 찾고자하는 값은 A+B*N<C*N이 성립이 되는 N의 최솟값(손익분기점)이다.

N은 판매된 노트북의 개수를 의미하니까 1씩 증가한다. 따라서, 손익분기점이 되는 N은 A+B*N=C*N이 성립되는 N에서 1을 더한 값이다.

여기서 변수가 되는 조건은 가변비용(B)가 판매비용(C)보다 클 경우와  가변비용과 판매비용이 동일할 경우이다.

전자는 팔면 팔수록 적자가 나는 구조이고, 후자는 이득이 발생하지 않는 구조이다.

둘 다 손익분기점이 존재하지 않기 때문에, 문제에서 요구하는 대로 -1을 출력해줘야 한다. print되는 문자열에 그냥

-1을 입력할 경우 숫자가 아닌 문자로 인식되기 때문에 %d를 이용해서 숫자로 출력했다.

 

◯배운 것

⩥무턱대고 코드를 짜는게 아니라 코드가 실행되는 시간을 최대한 단축시킬 방법을 생각해서 짤 것 

⩥파이썬에서 문자열이 아닌 자료형을 출력하기 위해서는 %를 사용해야 한다

728x90

'python > 문제' 카테고리의 다른 글

[백준/1193]분수찾기  (0) 2021.01.27
[백준/2292]벌집  (0) 2021.01.26
[백준/10951]A+B-4  (0) 2021.01.05
[백준/10952]A+B-5  (0) 2021.01.05
[백준/2577]숫자의개수  (0) 2021.01.01
728x90

◯문제 링크

 

[백준/10951]A+B-4

 

◯코드 미리보기

while True:
    try :
        a, b = map(int,input().split( ))
        if type(a) == int and type(b) == int:
            print("%d"%(a+b))
        

    except :
        break

 

 

 

설명

while True:

무한루프를 만들어준다. try-except를 활용하기 위해서이다.

 

try :
        a, b = map(int,input().split( ))
        if type(a) == int and type(b) == int:
            print("%d"%(a+b))

예외가 발생하지 않을 때 작동하는 코드이다. 

이전문제에서 굳이 list를 사용하지 않아도 된다는 사실을 깨달아서, 2개의 변수를 선언해준 뒤에 map함수와 split을 이용해서 입력과 동시에 int형으로 변환을 해주었다. map이 이터레이터라서 하나의 변수의 여러 개의 값이 저장될 수 있기 때문에 이런 형식으로 사용이 가능하다고 하는데, 아직 공부가 부족해서 무슨 의미인지 정확히 이해는 안된다. 일단은 그냥 이렇게 사용할 수 있다는 것만 배웠다.

 

except :
        break

되게 간단한 식이지만, 이번 문제의 핵심이다. 예외가 생길 경우 함수를 멈춰주는 코드다.

이 문제를 풀면서 조건이 주어지지 않아가지고 해결을 하지 못하고 있었는데, 검색을 해보니 예외처리에 대해서 배우게 되었다. 이 사실을 알게되니 런타임 에러가 발생하는 이유도 유추할 수가 있었는데, 아마 입력값으로 int를 제외한 다른 자료형이 주어져서 오류가 발생해서 런타임 에러가 발생한 것 같다. 

 

 

배운 것

⩥예외처리를 하는 방법을 알게 되었다. 앞서 말했던 try-except이다. 예외상황에 어떻게 작동해야할지 저장해줄 수 있다.

 break를 넣어서 런타임 에러가 뜨는게 아니라 코드가 끝나게 하거나, 조건에 as를 적어서 어떤 오류인지 표시하는 방법도 있다.

 

 

 

 

 

728x90

'python > 문제' 카테고리의 다른 글

[백준/1193]분수찾기  (0) 2021.01.27
[백준/2292]벌집  (0) 2021.01.26
[백준/1712]손익분기점  (0) 2021.01.23
[백준/10952]A+B-5  (0) 2021.01.05
[백준/2577]숫자의개수  (0) 2021.01.01
728x90

◯문제 링크

 

[백준/10952]A+B-5

 

◯코드 미리보기

Caselist = []


while True :
    Caselist = list(map(int,input().split( )))
    if Caselist[0]==0 and Caselist[1] == 0:
        break
    print("%d"%(Caselist[0]+Caselist[1]))

◯풀이

Caselist = []

먼저 사용할 리스트를 선언해준다.  나중에 코드를 다시 보니까 굳이 리스트를 이용할 필요는 없었을 것 같기는 하다. 

 

while True :

조건에서 어긋 날 때 까지 계속 루프를 반복해야 하므로, 무한루프를 만들어준다.

while문은 조건이 1(true)일 경우 안에 있는 코드를 실행시키므로 조건안에 1(true)를 넣어줄 경우 무한루프가 된다.

 

Caselist = list(map(int,input().split( )))

선언된 리스트 안에 값을 받아준다. map함수를 이용하면 list 안의 값을 int형으로 바꾸어 줄 수 있다.

일단 input().split( )부터 설명하자면, 입력을 받는 값을 공백으로 구별해서 입력받는 것이다. 이 형식은 list이다.

map함수는 반복 가능한 데이터(iterable)들에만 사용이 가능한데, list는 이에 해당하므로 사용이 가능하다.

map('사용할 함수', '원하는 변수')로 사용하는데, 이렇게 하면 값이 리스트로 나오게 된다.  그래서 Caselist의 요소를

넣어도 새로운 리스트롤 선언되기 때문에 초기화가 된다.

 

if Caselist[0]==0 and Caselist[1] == 0:
        break

입력값이 둘 다 0일 경우에는 멈춰야 하기 때문에 조건에 and를 넣어주고, if문 안에는 break를 넣어준다.

 

print("%d"%(Caselist[0]+Caselist[1]))

그리고 결과값을 출력해준다.

 

 

◯배운 것

⩥map 함수의 사용조건, map의 결과값이 list를 반환함. map('적용할 함수','원하는 변수')의 형태로 사용해야 함.

리스트나 튜플 같은 자료형에 사용할 때는 앞에 list(map(...))/tuple(map(...))같은 방식으로 사용해야 함

list입력 받을 때 int형변형이 필요할 경우, map함수를 이용해서 한 줄에 출력 할 수 있다.

⩥입력을 여러개를 한번에 받는 경우, 출력도 여러개가 한번에 나온다. 그래서 굳이 list를 추가적으로 만들어줄 필요가   없다.

 

728x90

'python > 문제' 카테고리의 다른 글

[백준/1193]분수찾기  (0) 2021.01.27
[백준/2292]벌집  (0) 2021.01.26
[백준/1712]손익분기점  (0) 2021.01.23
[백준/10951]A+B-4  (0) 2021.01.05
[백준/2577]숫자의개수  (0) 2021.01.01
728x90

◯문제 링크

 

[백준/2577]숫자의개수

 

◯코드 미리보기

Numlist = []

for i in range(3):
	Num = int(input())
	Numlist.append(Num)
    
Multiple = str(Numlist[0] * Numlist[1] * Numlist[2])



for i in range(10):
	Count = str(Multiple).count(str(i))
	print(Count)

 

예전에 풀었던 문제인데, 코드를 살짝 수정해 보았다.

 

 

설명

Numlist = []

for i in range(3):
	Num = int(input())
	Numlist.append(Num)
    

숫자를 입력받기 위해서 리스트를 생성한 뒤, 인트형으로 입력을 받고 생성된 리스트에 추가했다.

처음에는 for문에서 그냥 input으로 바로 받고 싶었는데, for문에서 새로운 변수를 계속 만드는 법을 몰라서 일단 list를 사용했다.

 

 

Multiple = str(Numlist[0] * Numlist[1] * Numlist[2])

입력 받은 값들을 전부 곱해준 뒤,

 

CountingNum = []

for i in range(10):
	Count = str(Multiple).count(str(i))
	CountingNum.append(Count)
	print(CountingNum[i])

그 값을 문자열로 바꾸어서 count함수를 이용해서 숫자의 개수를 세어주고 출력하는 것을 0부터 9까지 반복해주었다.

 

 

 

배운 것

⩥list에 문자를 추가할 때는 append를 이용해준다.

⩥특정 문자를 세어주는 함수는 count가 있다. 이것은 문자열에서 사용할 수 있다.

 

 

 

 

 

 

728x90

'python > 문제' 카테고리의 다른 글

[백준/1193]분수찾기  (0) 2021.01.27
[백준/2292]벌집  (0) 2021.01.26
[백준/1712]손익분기점  (0) 2021.01.23
[백준/10951]A+B-4  (0) 2021.01.05
[백준/10952]A+B-5  (0) 2021.01.05

+ Recent posts