본문 바로가기

Python(알고리즘,문제풀이)/BOJ (Bronze IV)

***백준 26350번 / Good Coin Denomination - 파이썬***

728x90

📚문제

출처 : 백준 26350번(https://www.acmicpc.net/problem/26350)

 

📝풀이

# 26350 Good Coin Denomination (좋은 액면가, 위대한 액면가)
n = int(input())
cnt = 0

for _ in range(n):
    coin_list = list(input().split())
    result = ' '.join(coin_list[1:])
    for i in range(1, len(coin_list[1:])):
        if int(coin_list[i]) * 2 > int(coin_list[i+1]):
            cnt += 1
    if cnt >= 1:
        print(f'Denominations: {result}')
        print('Bad coin denominations!') 
        print('')
    else:
        print(f'Denominations: {result}')
        print('Good coin denominations!')
        print('')

1. 입력받은 숫자들을 리스트로 만들고 (coin_list)

2. 첫번째 숫자를 제외한 나머지 화폐 종류들 중에서(coin_list[1:])

3. 액면가가 좋지 않은 경우 (coin_list[i] * 2 > coin_list[i+1]) 가 존재할 때

    cnt +=1 

4. 화폐 종류들 중에서 한 번이라도 액면가가 좋지 않으면 cnt가 1 이상이니까 

    cnt >= 1이상일 때 'Bad'출력

    아니면 'Good'출력

 

왜 틀렸는지 모르겠다

그냥 틀렸습니다 라고만 뜨니까.....

{result}출력할 때 str타입이라 그런가 해서

int 타입으로 변경해서 출력해봤는데도 안 되네

 

 

 

+

for _ in range(int(input())) :
    N, *D = map(int, input().split())
    res = False
    for i in range(1, N) :
        if (D[i-1] << 1) > D[i] :
            break
    else : res = True
    print("Denominations:", *D)
    print(["Bad coin denominations!", "Good coin denominations!"][res], '\n')

 

구글링해서 나온 단 하나의 파이썬 코드....

Chat GPT의 도움을 받아서

 

1. for _ in range(int(input())) :
- 사용자로부터 입력을 받아 정수로 변환하고, 그 값을 범위로 하는 루프를 돌립니다. _는 루프 변수를 사용하지 않겠다는 의미입니다.

2. N, *D = map(int, input().split())
- 사용자로부터 입력을 받아 공백을 기준으로 나누어 리스트로 만듭니다. 첫 번째 값은 N에 할당하고 나머지는 D 리스트로 할당합니다.

3. res = False
- res 변수를 선언하고 False로 초기화합니다.

4. for i in range(1, N) :
- 1부터 N-1까지의 숫자를 순회하는 루프를 시작합니다.

5. if (D[i-1] << 1) > D[i] :

- 현재 인덱스의 이전 값의 두 배가 현재 값보다 큰지를 검사합니다. 만약 크다면 아래 코드를 실행하게 됩니다.

6. break
- if 문의 조건이 참이면, 루프를 빠져나갑니다.

7. else : res = True
- 루프를 빠져나가지 않고 끝까지 순회했을 경우, res를 True로 설정합니다.

8. print("Denominations:", *D)
- 현재 화폐 단위 리스트 D를 출력합니다.

9. print(["Bad coin denominations!", "Good coin denominations!"][res], '\n')
- res 값에 따라서 리스트 [False, True]에서 해당하는 문장을 출력합니다. 
즉, "Bad coin denominations!" 또는 "Good coin denominations!" 중 하나를 선택하여 출력합니다.

어렵다...

우선 여기서 얻을 수 있는 개념은

1. *

여러 개의 숫자를 입력 받을 때 문자열 앞에 *를 설정하면 몇개가 되든 받아서 리스트로 만들 수 있다

 

2. else : res = True

for문을 돌 때  if문에서 한 번도 참이 되지 않아서 루프를 빠져나가지 못했을 때

res = True로 설정

특이한 점은 if와 같은 줄이 아니라 for와 같은 줄에 else를 설정

else 문이 for 문과 같은 줄에 있는 이유는 파이썬의 문법 구조 때문입니다. 
파이썬에서는 for문에 else문을 사용할 수 있습니다.

for 루프가 정상적으로 끝나면(즉, break 등으로 중간에 끊기지 않으면) else 블록이 실행됩니다. 
이것은 주로 특정 조건이 만족되지 않았을 때 추가적인 동작을 수행할 때 유용합니다.

따라서 이 코드에서 else: res = True는 for 루프가 끝까지 돌고 나서, 
즉 모든 i에 대해 (D[i-1] << 1) > D[i] 조건이 만족되지 않았을 때 실행됩니다. 
이것은 "좋은 화폐 단위"로 판별하는 것입니다.

하나 배웠다

 

3. print(['Bad coin denominations!', 'Good coin denominations!'][res],'\n')
['Bad','Good']이 들어간 리스트 생성

[res]값에 따라

1) True(=1)일 때 => 'Good'

2) False(=0)일 때 => 'Bad'

True와 False의 0과1 Boolean값과 리스트 인덱싱을 활용한 기막힌 해법...

728x90