본문 바로가기

Coding Tests/백준 온라인

(Python) 백준 25495번

 

<문제>

 

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

 

25495번: 에어팟

다섯 번째 핸드폰까지 연결하면 누적 배터리 소모량은 62퍼센트가 된다. 그리고 여섯 번째 핸드폰에 연결하면 배터리 소모량이 100퍼센트 이상인 126퍼센트가 되므로 현재 에어팟은 충전시켜야

www.acmicpc.net

 

<틀린 풀이>

 

N = int(input())

phone = list(map(int,input().split()))
battery = 2
n = 2
for i in range(1,N):
    if phone[i-1]==phone[i]:
        n*=2
        battery +=n

        if battery >= 100:
            battery = 0
            n = 1
    else:
        battery +=2
print(battery)

 

위 코드에는 반례가 존재하게 됩니다. 우선, else 부분에서 기존 누적돼있는 percent 값을 초기화시켜주지 않고, battery 값만을 생각해줬기 때문에 오답이 되게 됩니다. 이외에도 위 코드는 잘못된 부분이 존재하는데 그것은 밑에 또 다른 코드를 보며 설명을 하겠습니다. 

 

< 위 코드에 대한 반례 >

 

input 

8

2 2 1 3 1 2 2 1 

 

분명 정상적인 출력이라면 20이 결과값으로 나와야 할 것입니다. 

 

< 틀린 풀이2 >

 

N = int(input())

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

battery = 2
percent = 2 

for i in range(N-1):
    if A[i] == A[i+1]:
        percent*=2
        battery+=percent
        if battery >= 100:
            battery = 0
            percent = 1
    else:
        battery+=2
        percent = 2
print(battery)

 

다른 부분은 이상이 없지만 battery가 100 이상이 되면 처리되는 부분이 if 구문에만 들어가는 것이 아니라, else구문에도 위 부분이 들어가 줘야 합니다.

 

if 구문에서 100이상이 될지, else 구문에서 100 이상이 될지 알 수 없기 때문입니다.

 

사실 가장 처음에 제출한 코드는 battery가 100이상인지 아닌지에 따라 if else로 구분이 되게끔 작성했었는데, 문제를 풀다 보니 그 부분을 간과했던 것 같습니다. 

 

< PASS >

 

N = int(input())

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

battery = 2
percent = 2 

for i in range(N-1):
    if A[i] == A[i+1]:
        percent*=2
        battery+=percent
        if battery >= 100:
            battery = 0
            percent = 1
    else:
        battery+=2
        percent = 2
        if battery >= 100:
            battery = 0
            percent = 1
print(battery)

 

< map 사용하기 >

 

https://dojang.io/mod/page/view.php?id=2179 

 

파이썬 코딩 도장: 6.4 입력 값을 변수 두 개에 저장하기

지금까지 input 한 번에 값 하나만 입력받았습니다. 그럼 input 한 번에 값을 여러 개 입력받으려면 어떻게 해야 할까요? 이때는 input에서 split을 사용한 변수 여러 개에 저장해주면 됩니다(각 변수

dojang.io