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

[구름톤 챌린지] 1주차_1~ 3일차 학습

by 깁갑수 2023. 8. 17.
목차

구름에서 새로 시작된 구름톤 챌린지 온라인 알고리즘 문제풀이를 매일 1문제씩 풀어가며 4주간 성장한다는 내용이다 코드 짜는 법을 1 정도만 아는 뉴비로써 도전, 배워나가는 과정을 블로그에서 풀어보려 한다.

 

Day1 운동 중독 플레이어 - 구름LEVEL (goorm.io)

내 풀이 과정

공식이 주어지는 문제는 딱히 분석할게 없는 것 같다. 1RM을 구해야 하니 무게와 반복 횟수를 입력받아 공식에 대입하면 되는 문제.

프로그래밍? 코딩을 하는 방법의 1정도만 아는 내실력으론 첫 문제부터 쉽.... 사실 생각은 쉽다 그걸 구현해 내는 것이 쉽지 않을 뿐

 

한 줄에 두 개의 변수를 입력받는 것부터 내 머릿속에 없던 지식이었다. 여태 끄적거리던 코드들은 터미널로 입력해 본 경험조차 많지 않은 상황. 검색해 보니 split()을 이용해 입력받은 내용을 잘라서 저장할 수 있다고 한다. 입력받을 수 있는 input() 함수에 split을 합체해 본다.

문제 입력 예시

W, R = input().plit()

입력받은 것은 해결했으니 출력을 해줘야 한다 소수점 이하의 값을 버리는 법은 간단한 것 같다 int로 형변환을 해서 이미 알려준 수식으로 표현해 보았다.

print (int(int(W)*(1+int(R)/30)))

내가 작성한 답변은 아래와 같았지만 24시간 뒤 정해코드를 보니 역시나.. 더 좋은 방법이 있었다. 정해코드 참고. 

W, R = input().plit()
print (int(int(W)*(1+int(R)/30)))

 

정해코드

소수점을 버리기 위해 math.trunc()를 이용하고 여러 개의 입력을 받기 위해 map(int, input().split()) 를 사용한다고 한다.

구름톤에서 자랑한 문제풀이, 나도 두줄인데... import 빼면 내가 더짧음

trunc()는 입력된 값에서 소수점을 버리는 간단한 함수이나 map에 대한 이해가 전혀 없었다 사용 방법은 아래와 같음.

def add(n):
	return n + 1

a = [1, 2, 3]
# map 함수는 map object를 반환하기 때문에 자료형 변환이 필요합니다.
# map 함수는 순환 가능한 자료형 ex) List, Tuple 등의 모든 요소 함수를 적용합니다.
# 아래 코드는 a 리스트의 모든 요소에 add 함수를 적용한 결과를 반환한 결과입니다.
new_a = list(map(add, a))
print(new_a) # [2, 3, 4]

 위 방법을 이용해 입력받은 두 개의 변수 이 함수를 이용하면 int 형으로 바로 넣어줄 수 있기 때문에 추후에는 이렇게 입력받아 처리하도록 해야겠다.

W, R = map(int, input().split())

운동 중독 플레이어 정해코드 :

import math
W, R = map(int, input().split())
print(math.trunc(W * (1 + R / 30)))

 

Day2 프로젝트 매니징 - 구름LEVEL (goorm.io)

내 풀이 과정

 N 개의 기능 개발에 필요한 시간이 분으로 모두 제공되고 출력제한 사항인 24시간 표기( 00시 00분~ 23시 59분) 을 주의해서 해결하면 되는 문제로 보인다.

 

24시간 후에 공개되는 해설을 보고 풀었어야 했는데 급히 문제부터 풀다 보니 1일 차와 같은 방법으로 입력을 받았다.

줄 넘김 되는 곳은 input() 하나씩 배치하고 T, M을 입력받아 줬다. 그리고 계산이 필요해보니 int형으로 바꿔서 일단 넣어줌

n = int(input())
t, m = input().split()
t, m = int(t), int(m)

대장님이 이렇게 출력하라고 하시니 시간에 대한 계산까지 해줘야 한다.

for 문을 이용해 N의 개수만큼 작업 시간을 입력받아서 모두 m(분)에 더해줬고 60분이 넘어가는 건 시간으로 전환해 주기 위해 60으로 나눈 몫을 시간에 다시 더해주었다.

날짜가 넘어가는 것은 명시하지 않았으니 t(시간)을 24로 나눈 나머지를 구하는 방법으로 24시간이 넘어가는 시간은 제외해 주었고, 같은 방법으로 m 도 정리 해 주었다.

for x in range(n): m += int(input())

t += m // 60
t %= 24
m %= 60

출력 형식에서 또 막혔다 시와 분을 공백을 두고 출력하라고 하기에

최초 출력을 도전해 보았더니 1 tap크기정도로 출력이 된다.

(왜 이럴까 해설을 보기 전까진 상상도 못 했음...)

print(t,' ',m)

일단 내 머릿속에 떠오르는 방법 중에 가장 나아 보이는 아래 방법으로 출력하여 테스트는 통과하였다. 

다음날 해설이 너무나 기다려지는 문제

n = int(input())
t, m = input().split()
t, m = int(t), int(m)
for x in range(n): m += int(input())

t += m // 60
t %= 24
m %= 60

print (str(t)+' '+str(m))

정해코드

3일 차 아침이 밝았고 이번엔 해설부터 찾아봤다.

N은 따로 입력받고 T, M 은 1일 차에서 알려준 map()을 이용하여 받아줬다

 

N = int(input())
T, M = map(int, input().split())

.

이제 주어진 N 만큼 작업시간을 입력받아야 하는데 두 가지 방법을 사용할 수 있다고 한다.

내가 사용한 for문을 이용한 방법, 리스트 컴프리헨션을 이용해 리스트 자체로 받아내는 방법

나는 for문을 통해 모든 시간을 더해 한번에 처리하였고 해설에서는 둘 다 리스트로 작성하여 계산을 하였다.

 

'''
1. 일반적인 리스트 선언 후 값 추가하기

비어있는 리스트 c를 선언하고, for 문을 이용해 입력받기를 N번 반복합니다.
파이썬의 경우 리스트에 값을 추가하는 메소드는 append입니다.

추가로, 보통의 경우 for 문을 사용할 때 i를 사용하곤 하는데
아래와 같이 i가 사용되지 않는 경우 언더바(_)로 표기하기도 합니다.
예시) for _ in range(N) ...
'''
c = []

for i in range(N):
	c.append(int(input()))


'''
2. 리스트 컴프리헨션

리스트 컴프리헨션이란 리스트 내부에 계산식, for 문, if 문을 한줄로 넣어서 새로운 리스트를 만드는
파이썬만의 독특한 문법입니다.
아래의 경우 int(input())을 N번 반복하여 값을 입력받은 리스트를 c에 저장한다는 의미입니다.
'''
c = [int(input()) for _ in range(N)]

시간을 계산하는 부분에서도 다르게 계산을 했다.

 

'''
파이썬에서는 내장함수로 sum()을 지원합니다.
sum에 튜플이나 리스트 등을 인자로 전달하면 그 내부에 있는 원소들을 모두 더한 값을 반환합니다.

T에 60을 곱해 분으로 바꾸고, 주어진 M과 c의 총합과 합칩니다.
이를 1440으로 나눠주면 이 값은 0분 ~ 1439분 범위 내의 값이 됩니다.
'''

time = (T * 60 + M + sum(c)) % 1440

최종 정해코드는 아래와 같다 리스트 컴프리헨션 부분은 유용하게 써먹을 수 있겠지만 다음에 비슷한 상황에서 과연 쉽게 떠올릴 수 있을지 익숙해지는 시간이 필요할 듯하고, 시간을 저렇게 계산하는 거구나 하는 부분,, 내가 틀린 걸까?

팀프로젝트라도 한다면 대장이 시키는 대로 통일하면 될 거 같다. 아님 말고

N = int(input())
T, M = map(int, input().split())
c = [int(input()) for _ in range(N)]

time = (T * 60 + M + sum(c)) % 1440

hour = time // 60
minute = time % 60

print(hour, minute)

 

Day3 합 계산기 - 구름LEVEL (goorm.io)

사칙연산 +-*/를 할 수 있는 계산기를 만들고 그 결과를 모두 합치면 완료 대신 입력을 계산식으로 입력받기 때문에 이번에도 split()을 사용해야 할 것 같다. 이번엔 정수형만 받는 것이 아니기 때문에 map 사용은 하지 않았다.

T개의 계산식 계산식 개수가 주어지고 계산식을 입력받기 위해 for문으로 계산식을 입력받기로 했다.

for x in range(int(input())):
	n1, op, n2 = input().split()

그리고 각 계산식의 결과를 모두 합하기 위해, 또 나눗셈의 나머지는 버리기 위해 몫으로만 나눗셈을 처리하였다.

결과를 모두 더해야 했기에 먼저 solution 0으로 변수를 초기화하고 결과는 모두 더해주었다.

입, 출력 예시

solution = 0
for x in range(int(input())):
	n1, op, n2 = input().split()
	if op =='+': solution +=int(n1) + int(n2)
	if op =='-': solution +=int(n1) - int(n2)
	if op =='*': solution +=int(n1) * int(n2)
	if op =='/': solution +=int(n1) // int(n2)
print(solution)

정해코드

내가 해결했던 방법과 거의 비슷했지만 else if를 사용하였으며 여러 입력에 대해 배열로 처리되도록 작성했다.

2일 차도 그렇고 배열로 받는 것이 정말 정해진 규칙인 건가? 알아보기 쉬워서? 며칠 더 경험해 보고 계속해서 배열로 받는다면 나도 답안작성 시 배열로 작성을 해줘야 할 것만 같다.

result = 0
T = int(input())

for i in range(T):
	s = input().split()
	firstNum = int(s[0])
	command = s[1]
	secondNum = int(s[2])
	
	if command == "+":
		result += firstNum + secondNum
	elif command == "-":
		result += firstNum - secondNum
	elif command == "*":
		result += firstNum * secondNum
	else:
		result += firstNum // secondNum

print(result)
"갑수야 반갑수"에는 쿠팡파트너스 등 제휴링크가 포함 되어 있으며 수수료를 제공받을 수 있습니다.