본문 바로가기
교육/구름톤 챌린지

[구름톤 챌린지 WEEK 1 - 구현] DAY 4 ~ 5 리뷰

by hi-rachel 2023. 8. 17.

DAY 4. 완벽한 햄버거 만들기

- 풀이

n = int(input())
sum_list = 0

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

def hamberger():
	global n, k_list
	max_k = k_list.index(max(k_list))
	
	for i in range(max_k, n-1):
		if k_list[i] < k_list[i+1]:
			return 0
	
	for i in range(max_k -1, 0, -1):
		if k_list[i] < k_list[i-1]:
			return 0
		
	return sum(k_list)
print(hamberger())

 

🌟 배열 정렬 방법
1. sort() 함수의 경우 원본 배열을 직접 변경 => 호출시 반환값 x = None 반환
2. sorted() 함수의 경우 원본 배열을 건드리지 않고, 정렬된 새로운 배열을 반환 (복사본 생각)

🌟 배열 합하는 방법
1. + 사용 (직관적)
2. extend 사용

 

- 정해 (sort() 사용)

N = int(input())
arr = list(map(int, input().split()))

MAX = max(arr)
maxIndex = arr.index(MAX)


left = arr[:maxIndex]
right = arr[maxIndex:]

left.sort()  # 오름차순
right.sort(reverse=True)  # 내림차순

sortedArr = left + right

check = True

for i in range(N):
    if arr[i] != sortedArr[i]:
        check = False
        break
    
    if check:
        print(sum(arr))
    else:
        print(0)

 

- 정해 (sorted(), for else 구문 사용)

N = int(input())
arr = list(map(int, input().split()))

MAX = max(arr)
maxIndex = arr.index(MAX)

left = arr[:maxIndex]
right = arr[maxIndex:]  # maxIndex 포함

sortedLeft = sorted(left)
sortedRight = sorted(right, reverse=True)

sortedArr = sortedLeft + sortedRight

# for else 구문 이용
for i in range(N):
    if arr[i] != sortedArr[i]:
        check = False
        break
else:
    print(sum(arr))  # 햄버거의 맛 출력

 

🌟 for else

for i in range(N):
    if 조건문:
        break
else:
    코드

for문 중간에서 break가 실행되면 else 부분 실행 x

break에서 걸리지 않고 for문이 끝까지 도는 경우 else 부분 실행

 


DAY 5. 이진수 정렬

- 시도한 풀이

import string

n, k = map(int, input().split())

# 기존 10진수 내림차순 정렬
n_list = list(map(int, input().split()))
n_list.reverse()

# 2진수로 바꾸기
def convert(num, base):
	number = string.digits + string.ascii_uppercase
	q, r = divmod(num, base)
	return convert(q, base) + number[r] if q else number[r]

# 1의 개수 세기
def one_counter(num):
    cnt = list(num).count('1')
    return cnt

one_dict= {}

for n in n_list:
  one_dict[n] = one_counter(convert(n, 2))


sorted_k = dict(sorted(one_dict.items(), key=lambda item: item[1], reverse=True))

print(list(sorted_k.keys())[k-1])

- 마침 어제 정리한 10진수를 n진수로 바꾸는 함수를 사용하고

- 1의 개수를 세서, 딕셔너리로 만들어 1의 개수로 정렬해 k번째 수를 찾으려고 했는데 테케 1, 2번만 통과하고 실패했다.

 

생각이 아예 잘못된 것인지, 무엇이 잘못된 것인지 모르겠어서 구름톤 같이 진행하는 스터디 팀원분들에게 물어보니 dictionary 사용 대신 array 사용을 해보라고 들었다. 정렬은 sort()가 자동으로 첫번째 값, 두번째 값으로 정렬해준다.

 

+ 같은 변수명 사용을 지양하라는 피드백을 받았다.

 

- 풀이

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
nums = list(map(int, input().split()))
cnt = []
for num in nums:
  binary = bin(num)[2:]
  cnt.append((binary.count('1'), num))

cnt.sort(reverse=True)
print(cnt[k-1][1])

bin() 함수로 이진수로 바꿔주고 앞에 0b는 빼준다 ([2:])

1의 개수로 먼저 정렬, 다음에 num

 

훨씬 간단하다!

 

✏️ bin()

bin(number)

- 정수를 이진수 표현으로 바꿔준다.

- 0b(2진수 문자열이라는 뜻)가 앞에 붙어 출력

 

- 정해

N, K = map(int, input().split())
arr = list(map(int, input().split()))

newArr = []

for i in range(N):
    binaryNumber = bin(arr[i])[2:]
   	
    count = 0
    
    for c in binaryNumber:
    	if c == '1':
            count += 1
   
    newArr.append([count, arr[i]])
    
newArr.sort(reverse=True)
print(newArr[K - 1][1])

 

다음주도 도전!

 

참고

https://www.programiz.com/python-programming/methods/built-in/bin

구름톤