루나의 TIL 기술 블로그

프로그래머스 level 1 자연수 뒤집어 배열로 만들기

|

프로그래머스 자연수 뒤집어 배열로 만들기 문제

사고 과정

자릿수를 뒤집은 다음 찢어서 배열에 넣는다.

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: 뒤집어진 숫자를 반환!

예들 들어,

x: 1234
return: 4321
x: -1234
return: -4321
x: 1230
return: 321

답안

def reverse(number):
  if number > 0:
      return int(str(number)[::-1])
  if number < 0:
      return int('-'+str(number*-1)[::-1])
  else:
      return 0

백준 2908 상수

|

백준 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를 잘 사용하는 방법이 많다.
문자형과 숫자형을 펼쳤다 붙였다하고 리스트에 넣었다 뽑았다하는 것을 잘 할 수 있어야겠다.

백준 1157 단어공부

|

백준 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을 풀 때 특히 다른 곳에서 가져온 것이라면 한 줄 한 줄 다 이해하고 주석을 달아놓는 것이 좋을 것 같다.

백준 4673 셀프넘버

|

백준 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 추가

백준 1065 한수

|

백준 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이라는 리스트에 넣는다는 뜻이다.

뭔가 쓸데없이 복잡해지는 것 같기도한데.. 숫자는 숫자로 처리하는게 좋은 것 같다.
답을 안 보고 문법만 참고해서 끝까지 풀 수 있게 됐다!

백준 8958 OX퀴즈

|

백준 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문에 조금 익숙해졌다.  
변수가 몇 개 필요한지 미리 생각을 더 해보는 것이 좋겠다.

백준 4344 평균은 넘겠지

|

백준 4344번 평균은 넘겠지 문제

사고 과정

n = int(input())
for i in range(n):
    a = list(input())
    pct = 0
    avg = 0
    sum = 0
    for i in a:
        sum += i
        #모든 점수를 더한 총점을 만들어서 
    avg = sum/len(a)
    #총점을 사람수로 나눈 것이 평균이 된다
    for i in a:
        if i > avg:
            count += 1
            #평균이 넘는 학생 수를 세서
    pct = count/len(a) * 100
    #총 학생수 중 평균이 넘는 학생수의 퍼센테이지를 구한다
    print(pct)


제출 답안

n = int(input())
for _ in range(n):
    grades = list(map(int, input().split()))
    avg = sum(grades[1:])/grades[0]
    #입력값 중에 총 학생 수가 맨 앞에 들어있는걸 제대로 못 봤다
    #sum(grades[1:])을 처음 봤는데 참 좋은 구문이다
    cnt = 0
    for grade in grades[1:]:
        if grade > avg:
            cnt += 1
    pct = cnt/grades[0] *100
    print(f'{pct:.3f}%') 
    #.을 빼먹어서 왜 틀렸는지 5분쯤 고민했다

주요 포인트 및 생각해볼 점

인덱스를 사용한 부분이 간결하다.

백준 1546 평균

|

백준 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)

주요 포인트 및 생각해볼 점

입력을 한 줄에 받을 때와 새로운 줄에 받을 때 각각 리스트와 반복문으로 받아서 저장하는 방법을 익혔다.

백준 3052 나머지

|

백준 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)))

주요 포인트 및 생각해볼 점

입력을 새로운 줄에 받을 때 반복문으로 받아서 저장하는 방법을 익혔다.

백준 1110 더하기 사이클

|

백준 더하기 사이클 문제

사고 과정

전의 두 숫자를 더한 값의 일의 자리가 새 숫자의 일의 자리가 되고
전의 두 숫자 중 일의 자리가 새 숫자의 십의자리가 되는 사이클을 만들었다.

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분정도 고민하고 바로 답을 찾아보고 있는데 답을 너무 빨리 보는건가 싶은데  
무슨 함수를 써야되는지 모르겠어서 힌트 없이 풀려면 너무 진척이 없을 것 같다.     
쉬운 문제들은 조금 시간이 지난 뒤에 다시 풀어보면 좋지않을까싶다.