13 Jun 2021
|
기초
프로그래머스
TIL
프로그래머스 자연수 뒤집어 배열로 만들기 문제
사고 과정
자릿수를 뒤집은 다음 찢어서 배열에 넣는다.
def solution(n):
n = str(n)[::-1]
return(list(map(int, n)))
백준에서 배웠던 (list(map(int, n))) 과 a[::-1]를 쓸 수 있어서 뿌듯했다
모범 답안
def digit_reverse(n):
return list(map(int, reversed(str(n))))
주요 포인트 및 생각해볼 점
파이썬 리스트 순서 뒤집기: reverse, reversed와 [::-1]등 설명이 잘 나와있다.
추가 : 정수 뒤집기
문제
reverse 함수에 정수인 숫자를 인자로 받습니다. 그 숫자를 뒤집어서 return해주세요.
x: 숫자
return: 뒤집어진 숫자를 반환!
예들 들어,
답안
def reverse(number):
if number > 0:
return int(str(number)[::-1])
if number < 0:
return int('-'+str(number*-1)[::-1])
else:
return 0
13 Jun 2021
|
입문
나중에 살펴보기
백준
TIL
백준 2908번 상수 문제
사고 과정
백의자리와 일의자리를 서로 바꾸고 둘 중 큰 수를 출력한다
a = list(map(int, input().split()))
#한 줄에 입력받은 두 수를 리스트에 저장한다
h = int(a[0]/100)
t = int(a[0]%100/10)
o = int(a[0]%10)
new_nums = []
new_nums.append(100 * o + 10 * t + h)
#리스트 중 첫번째 수를 백의자리와 일의자리를 서로 바꿔서 새 리스트에 추가한다
h = int(a[1]/100)
t = int(a[1]%100/10)
o = int(a[1]%10)
new_nums.append(100 * o + 10 * t + h)
print(new_nums)
#두 수를 비교해서 큰 수를 출력한다
print(max(new_nums))
잘 작동하는데 제출하니까 틀렸다고 나온다.
왜 틀린걸까..?
제출 답안
a, b = input().split()
# 두 변수를 입력받음
a = int(a[::-1])
b = int(b[::-1])
# a[::-1] 이렇게 하면 역수가 된다
if a > b :
print(a)
else :
print(b)
출처 : 유혹하는 개발하기
주요 포인트 및 생각해볼 점
indice를 잘 사용하는 방법이 많다.
문자형과 숫자형을 펼쳤다 붙였다하고 리스트에 넣었다 뽑았다하는 것을 잘 할 수 있어야겠다.
13 Jun 2021
|
기초
내용 추가하기
백준
TIL
백준 1157번 단어공부 문제
사고 과정
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.
word = input().upper()
#입력받은 단어를 대문자로 word 변수에 저장한다.
unique_word = list(set(word))
print(unique_word) #zZa 의 경우 : ['Z', 'A']
#입력받은 단어에 사용된 알파벳을 중복되지 않은 리스트로 저장한다. set()의 사용
cnt_list = []
for i in unique_word:
#unique_word의 각 알파벳들을 iterate하면서
cnt = word.count(i)
#word변수에 들어있는 해당 알파벳의 갯수를 cnt변수에 저장한다
cnt_list.append(cnt)
#cnt의 값을 cnt_list 배열에 집어넣는다
print(cnt_list) #[2,1]
if cnt_list.count(max(cnt_list)) > 1:
#cnt_list의 최대 인수의 갯수가 1개를 넘으면
print('?')
#물음표를 출력한다
else:
print(unique_word[(cnt_list.index(max(cnt_list)))].upper())
#아니라면 최대 인수의 위치를 cnt_list에서 찾아서
#풀어서 설명하자면
print(max(cnt_list)) # 사용된 알파벳의 갯수 중 가장 큰 수 : 2
print(cnt_list.index(2)) # cnt_list에서 2의 값의 위치 : 0
print(unique_word[0]) #unique_word리스트에서 0번째 값 : Z
3일 후에 다시 보니까 마지막 부분이 좀 헷갈렸는데
unique_word와 cnt_list값이 순서대로 1:1로 대응되기 떄문에 쓸 수 있는 방법인 것 같다.
숏코딩
from statistics import*
try:t=mode(input().upper()) #t에 최빈값(mode)을 저장한다
except:t='?' #안 되면 ? 출력
print(t)
수학통계함수 statistics(설명)[https://python.flowdas.com/library/statistics.html]와 오류예외처리구문(설명)[https://wikidocs.net/30]을 이용한 간결한 코드이다!
주요 포인트 및 생각해볼 점
다른 조원의 블로그롤 보고 생각이 나서 algorithm을 푼 3일 뒤에 다시 살펴봤는데 마지막 줄을 읽을 수 없어서 당황스러웠다.
algorithm을 풀 때 특히 다른 곳에서 가져온 것이라면 한 줄 한 줄 다 이해하고 주석을 달아놓는 것이 좋을 것 같다.
12 Jun 2021
|
기초
나중에 살펴보기
백준
TIL
백준 4673번 셀프넘버 문제
사고 과정
자기자신과 자기자신을 구성하는 숫자들을 더한 리스트를 만들고 정수리스트에서 뺀다.
for i in range(1,10001):
a = i + str(i)
nums = []
nums.append(a)
print(range(1,10001) - set(nums))
#런타임에러
제출 답안
natural_num = set(range(1,10001))
generated_num = set()
for i in range(1,10001):
for j in str(i):
i += int(j)
generated_num.add(i) # add 함수 사용
self_num = sorted(natural_num - generated_num)
for i in self_num:
print(i)
출처 in my duty 블로그
숏코딩
r=range(9999);
print(*sorted({*r}-{n+sum(map(int,str(n)))for n in r}))
읽을 수가 없다 ㅋㅋㅋㅋ
주요 포인트 및 생각해볼 점
add와 append의 차이점 알아보기
set은 문자열 리스트에서만 쓸 수 있는걸까?
문제가 점점 어려워지고 있다.
런타임에러가 안 나도록 문법은 맞춰서 제출해야겠다.
*r 은 무엇을 의미하는걸까?
06.18 추가
12 Jun 2021
|
기초
나중에 살펴보기
백준
TIL
백준 1065번 한수 문제
사고 과정
100미만이면 입력한 수를 출력하고, 100이상이면 공차가 같은 수들의 리스트를 구해서
(일의자리 - 십의자리 = 십의자리 - 백의자리 )그 수들의 갯수 +99 를 출력한다.
n = int(input())
if n < 100:
print(n)
if n => 100: #비교연산자 위치 틀렸다
for i in range(100,n):
#num = list(map(int, str(i))) 넣어야함
if num[2] - num[1] = num[1] - num[0]:
nums.add(num)
print(len(nums)+99)
제출 답안 1
n = int(input())
nums = set()
#그냥 nums=[]했더니 리스트에는 add함수가 없다고 해서 set으로 만들었다
if n < 100:
print(n)
if n >= 100: #크거나 같다 비교연산자
for i in range(100,n+1):
#n이 포함되려면 1을 더해야한다
hund = int(i / 100)
ten = int((i % 100) / 10)
one = int(i % 10)
#인터넷에서 찾은 각 자리수별 숫자 추출법
if hund - ten == ten - one:
nums.add(i)
print(len(nums)+99)
제출 답안 2
n = int(input())
nums = set()
if n < 100:
print(n)
if n >= 100:
for i in range(100,n+1):
num = list(map(int, str(i)))
if num[2] - num[1] == num[1] - num[0]:
nums.add(i)
print(len(nums)+99)
주요 포인트 및 생각해볼 점
map함수는 map(변환 함수, 순회 가능한 데이터) 이렇게 사용한다.
num = list(map(int, str(i)))
이 구문은 문자형으로 저장된 i를 iterate해서(int는 iterate할 수 없다)
map을 이용해 하나씩 int형으로 변환해서 num이라는 리스트에 넣는다는 뜻이다.
뭔가 쓸데없이 복잡해지는 것 같기도한데.. 숫자는 숫자로 처리하는게 좋은 것 같다.
답을 안 보고 문법만 참고해서 끝까지 풀 수 있게 됐다!
11 Jun 2021
|
기초
백준
TIL
백준 8957번 OX퀴즈 문제
사고 과정
O가 한개면 1을 더하고 O가 두 개면 1을 더하고… O가 4개면 1을 더한다.
n = int,input()
for _ in n:
a = list((input())
count = 0
for i in a
if 'O' in i :
count += 1
if 'OO' in i :
count += 1
if 'OOO' in i:
count += 1
if 'OOOO' in i:
count += 1
print(count)
제출 답안
n = int(input())
for _ in range(n):
a = list(input())
sum = 0
#sum 과 cnt(카운트)를 따로 만들었어야했다
cnt = 0
#sum은 총점, cnt는 점수를 누적할 때 사용되는 변수이다
for i in a:
if i =='O':
cnt += 1
#O의 갯수만큼 카운트를 1씩 증가시키고
sum += cnt
#늘어난 카운트를 총점에 누적시킨다
else:
cnt = 0
#X가 나오면 카운트를 0으로 리셋한다
print(sum)
주요 포인트 및 생각해볼 점
중첩된 for문에 조금 익숙해졌다.
변수가 몇 개 필요한지 미리 생각을 더 해보는 것이 좋겠다.
11 Jun 2021
|
기초
백준
TIL
백준 1546번 평균 문제
사고 과정
입력받은 점수를 저장하고 해당 식을 적용해서 새 점수들을 구한다.
구한 새 점수들의 평균값을 출력한다.
list_grades = []
list_grades_new = []
n = int,input()
for i in n:
a = int(input())
list_grades.append(a)
max_grade = max(list_grades)
list_grades_new.append(i/max_grade*100)
print(sum(new_grade)/n)
제출 답안
n = int(input())
list_grades = list(map(int, input().split()))
#연속해서 받는 입력값의 처리
max_grade = max(list_grades)
new_grades = []
for i in list_grades:
new_grades.append(i/max_grade*100)
print(sum(new_grades)/n)
주요 포인트 및 생각해볼 점
입력을 한 줄에 받을 때와 새로운 줄에 받을 때 각각 리스트와 반복문으로 받아서 저장하는 방법을 익혔다.
10 Jun 2021
|
기초
백준
TIL
백준 3052번 나머지 문제
사고 과정
수를 차례대로 입력받아서, 입력값들을 42로 나눈 나머지를 리스트에 저장하고, 리스트의 원소의 갯수를 출력한다
a = int,input()
b = int,input()
c = int,input()
d = int,input()
e = int,input()
f = int,input()
g = int,input()
h = int,input()
i = int,input()
j = int,input()
list_nums = {a%42, b%42, c%42, d%42,e%42, f%42, g%42, h%42, i%42, j%42}
print(len(set(list_nums)))
제출 답안
list_nums = []
for _ in range(10):
#반복해서 쓰는 것은 항상 반복문으로 쓰자
a = int(input())
#새로운 줄에 받는 입력값의 처리
b = a % 42
list_nums.append(b)
#append의 사용에 익숙해져야겠다
print(len(set(list_nums)))
주요 포인트 및 생각해볼 점
입력을 새로운 줄에 받을 때 반복문으로 받아서 저장하는 방법을 익혔다.
09 Jun 2021
|
기초
백준
TIL
백준 더하기 사이클 문제
사고 과정
전의 두 숫자를 더한 값의 일의 자리가 새 숫자의 일의 자리가 되고
전의 두 숫자 중 일의 자리가 새 숫자의 십의자리가 되는 사이클을 만들었다.
n = int(input())
while true
counter += i
n = n[1]+(n[0]+n[1])[1]
if n == n:
break
print(counter)
제출 답안
num = int(input())
check = num #같은 값이지만 새 변수로 만들어야했다.
new_num = 0
temp = 0
count = 0
while True:
temp = num//10 + num%10
new_num = (num%10)*10 + temp%10
count += 1
num = new_num
#new_num을 num에 넣어서 num이 계속 돌아가게 한다
if new_num == check:
break
print(count)
주요 포인트 및 생각해볼 점
10분정도 고민하고 바로 답을 찾아보고 있는데 답을 너무 빨리 보는건가 싶은데
무슨 함수를 써야되는지 모르겠어서 힌트 없이 풀려면 너무 진척이 없을 것 같다.
쉬운 문제들은 조금 시간이 지난 뒤에 다시 풀어보면 좋지않을까싶다.