230830 프로그래머스 문제풀기 & 1대1 코칭
+ 어제는 SQLD pdf로 한번 쓱 훑기 전에 다른 스터디원분께서 올려주신 강의 영상을 보았다 !
다본건 아니지만 괜찮은 강의 영상이었다 ㅎ.ㅎ 다 볼 예정 ~~
[SQL] SQL 기초 다지기 | SQL 기초 | SQL 무료 강의 | 정보처리기능사 | SQLD | 정보처리기사 - YouTube
[SQL] SQL 기초 다지기 | SQL 기초 | SQL 무료 강의 | 정보처리기능사 | SQLD | 정보처리기사
SQL 기초 / SQL 응용 / SQL 무료강의
www.youtube.com
요 유튜브 영상이다 ! \(@^0^@)/
오늘은 일단 프로그래머스 문제 풀기를 위주로 가보려고 한다 !
* 로그인 성공 ? 문제에서
처음에 나는 db를 dict형태로 바꾸어서 문제를 풀려고 했는데 뭔가 복잡해지는것같아 그냥
def solution(id_pw,db):
for i in db:
if id_pw[0] == i[0] and id_pw[1] == i[1]:
return "login"
elif id_pw[0] == i[0] and id_pw[1] != i[1]:
return "wrong pw"
return "fail"
이렇게 문제를 해결하였다 !
그런데 다른분이 dict을 사용해서 문제를 푸신게 있어서 가져와봤다 !
def solution(id_pw, db):
if db_pw := dict(db).get(id_pw[0]):
return "login" if db_pw == id_pw[1] else "wrong pw"
return "fail"
Python 3.8부터 바다코끼리 연산자 (:=)가 도입되었다고 한다 ! 간단히 말해, 할당과 반환을 동시에 하는 연산자라고 한다.
변수 := 표현식
작동하는 방식은 표현식의 결과를 변수에 할당하고, 동시에 반환하는것이다.
즉, 변수 = 표현식을 하고, return 변수 기능을 한다 !
예를 보면,
## 1번 코드 -> 일반 코드
s='walrus eat kimchi' ## s에 문자열을 할당
result = 'walrus' in s ## 'walrus' in s를 result에 할당
if result: ## result가 True라면
print(s) ## s 출력
print(result) ## result 출력
>>> walrus eat kimchi
>>> True
## 2번 코드 -> := 사용
## s에 문자열을 할당하고, 'walrus' in s를 result에 할당하고, result가 True 라면
if result := 'walrus' in (s := 'walrus eat kimchi'):
print(s) ## s 출력
print(result) ## result 출력
>>> walrus eat kimchi
>>> True
이렇게 코드가 간결해진다는 것을 볼 수 있다 !
또 다른 예시를 보면,
li=[] # 빈리스트 생성
for i in range(10):
if i==0:
start=i # start에 초기값 할당
if i==9:
end=i # end에 마지막값 할당
li.append(i) # 차례대로 리스트에 삽입
print(li) # 리스트 출력
print(start,end) # start, end 출력
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 0 9
## 리스트를 만듬과 동시에 i가 0일때 start에 0을 넣어주고, end에 값을 계속 넣어 마지막값역시 end에 할당
li = [(end:=i) if i else (start:=i) for i in range(10)]
print(li) # 리스트 출력
print(start, end) # start, end 출력
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 0 9
이렇게 활용할 수 있다 !
그리고 GET 함수는
딕셔너리의 get(x) 함수는 x라는 key에 대응되는 value값을 돌려준다.
만약 get(x, 'A') 함수에 두번째 인자를 넣어주면 x라는 key가 딕셔너리에 없는 경우, 'A' 디폴트 값을 돌려준다.
'A'라는 key값이 딕셔너리에 없는데 dic['A']을 사용하면 key 오류를 발생시킨다. get함수를 사용하면 key값이 없어도 오류를 발생시키지 않고 None을 반환해준다.
즉, 딕셔너리 안에 찾으려는 Key 값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때에는 get(x, '디폴트 값')을 사용하면 된다.
참고하면 좋을
[python] 딕셔너리 객체의 get() 메소드 사용법
오늘은 딕셔너리 객체의 get() 메소드에 대해 설명하도록 하겠습니다. 먼저 get() 메서드의 필요성을 먼저 살펴보겠습니다. 우선 과일 종류를 키로, 가격을 값으로 갖는 다음과 같은 딕셔너리 a가
bskyvision.com
https://yang-wistory1009.tistory.com/38
파이썬 Dictionary, get(), keys(), values(), items() 사용법, 파이썬 mapping type - 공부하는 도비
- mapping type : mapping object는 값의 대응 관계를 표시하여 임의의 key 값으로 value를 찾습니다. 파이썬의 mapping type은 Dictionary가 유일하고, 순서 열과 다르게, 순서 X, 중복 X, 수정 O, 삭제 O 와 같은 특
yang-wistory1009.tistory.com
그래서 ! 이 코드를 보고 dict함수를 사용하는데에 더 익숙해져야겠다는 생각이 들었다 !
* 등수 매기기 문제에서는
처음에 나는
def solution(score):
num = []
answer = []
for i in score:
num.append((i[0]+i[1]) // 2)
num1 = sorted(num,reverse=True)
for j in range(len(num)):
for k in range(len(num1)):
if num[j] == num[j-1]:
answer.pop()
answer.append(answer[-1])
break
elif num[j] == num1[k]:
answer.append(k + 1)
return answer
이렇게 코드를 짰는데, 채점결과 fail했다 ㅠ
구글링해본 결과 , 내가 너무 복잡하게 생각하고 있었나보다 ㅠ
def solution(score):
num = []
answer = []
for i in score:
num.append(sum(i) / 2)
num1 = sorted(num,reverse=True)
for i in num:
answer.append(num1.index(i) + 1)
return answer
이렇게 해결하면 되는거였음 !
정확한 평균을 위해 sum(i)//2가 아니라 sum(i)/2를 해줘야하는거였고 !
index함수는 배열에 같은수가 들어있을때 가장 앞의 index를 반환한다는것을 잘 기억하고 있었으면 손쉽게 풀 수 있었을 것 같다 ㅠ 아쉽 ㅠ
그리고 더 간결한 코드가 있었다 !
def solution(score):
a = sorted([sum(i) for i in score], reverse = True)
return [a.index(sum(i))+1 for i in score]
매우 매우 간결쓰 !
(⊙o⊙ ) !
+ sorted함수는
num1 = sorted(num,reverse=True)
이런식으로 쓰면 되고,
sort함수는
num1 = num.sort(reverse=True)
이런식으로 쓰면 된다 !
* 치킨 쿠폰 문제는
처음에 입출력 예시에서 1081의 경우를 이해하는데 좀 시간이 걸렸다 ㅋ ㅋ ㅋ
그래서 쓰면서 정리를 해봤더니
이렇게 정리가 되었다 ! (대충한거라 글씨가 ㅎ.ㅎ ..)
어쨌든 ! 그래서
def solution(chicken):
result = 0
while chicken >= 10:
result += chicken // 10
chicken = chicken % 10 + chicken // 10
return result
이렇게 문제를 풀었다 ~
* 대소문자 바꿔서 출력하기 문제는
여러가지 방법으로 풀 수 있는데,
str = input()
answer = ""
for i in str:
if i.isupper():
answer += i.lower()
elif i.islower():
answer += i.upper()
print(answer)
이렇게도 할 수 있고,
print(input().swapcase())
이렇게도 풀 수 있다 !
* 유한소수 판별하기 문제에서는
최대공약수를 활용하는 방법을 알 필요가 있다는 생각이 들었다 !
구글링을 해보니 두가지 방법이 있었다 !
from math import gcd
def solution(a,b):
b //= gcd(a,b)
while b%2 == 0:
b //= 2
while b%5 == 0:
b //= 5
return 1 if b == 1 else 2
이건 가장 깔끔한 방법이고,
다음 방법은 math함수를 이용할 수 없을때 코드를 짜는 방법이다 !
def gcd(a,b):
if a % b == 0:
return b
else:
return gcd(b,a%b)
def factorization(x):
d = 2
output = []
while d <= x:
if x % d == 0:
output.append(d)
x /= d
else:
d += 1
return output
def solution(a,b):
divide_num = gcd(a,b)
result = b // divide_num
for num in factorization(result):
if num not in [2,5]:
return 2
return 1
길지만 익혀두면 좋을 것 같다 !
두 코드에 대한 설명은
https://chan-lab.tistory.com/34
[프로그래머스] 유한소수 판별하기 파이썬 문제 풀이 #유클리드 호제법 #소인수분해
안녕하세요. 은공지능 공작소의 파이찬입니다. 오늘은 프로그래머스 유한소수 판별하기 문제 풀어보겠습니다. 문제를 풀기 위해 알아야 할 개념은 크게 2가지 입니다. 1. 유클리드 호제법 (최대
chan-lab.tistory.com
이 링크를 참조하면 될 것 같다 !
이 외에도 굉장히 간단한 코드가 있었다 !
def solution(a, b):
return 1 if a/b * 1000 % 1 == 0 else 2
센스있는 답변같다 ㅎㅎ

그리고 1대1 코칭으로 두문제를 풀었는데, 함께 고민도 하고 내가 부족한 부분을 채울 수 있던 시간이었다 !
* 2의 영역 문제에서는
일단 세가지 조건으로 나누는 선행조건이 필요했다 !
def solution(arr):
if 2 not in arr:
return [-1]
elif arr.count(2) == 1:
return [2]
for i,a in enumerate(arr):
if a == 2:
for j,b in enumerate(arr[::-1]):
if b == 2:
return arr[i:len(arr)-j]
count함수와 enumerate함수 쓰는거에 조금 더 익숙해져야겠다고 느꼈다 !
내가 짠 코드를 더 간결화한 코드가 있어 가져와봤다 !
def solution(arr):
return [-1] if 2 not in arr else arr[arr.index(2) : len(arr) - arr[::-1].index(2)]
이렇게 하면 바로 답이 나온다 !
와웅 ,,!@!
* 공던지기 문제는
스터디장님과 푸는데 계속 런타임 에러가 나서 ㅋㅋ ㅜ 굉장히 애를 썼던 문제였다 ..!
이프로가 부족해서 ..!

처음에는
def solution(numbers,k):
idx = (k-1) * 2
if idx < len(numbers):
return numbers[idx]
else:
idx -= len(numbers)
return numbers[idx]
이런식으로 문제를 풀려고 했는데 계속 런타임 에러가 났다 ,,
근데 k의 범위를 너무 생각하지 않아서 발생했던 문제여따 ..!
결국은 그 문제를 알아내서
def solution(numbers, k):
idx = (k-1) * 2
while idx >= len(numbers): # idx가 numbers의 길이보다 크거나 같으면 반복
idx -= len(numbers)
return numbers[idx]
이렇게 while문으로 돌리는 코드로 문제를 해결해똬 ㅠ ㅠ !
다른 분들은 더 간결하게 푸셨다 !
def solution(numbers, k):
return numbers[2 * (k - 1) % len(numbers)]
이렇게 바로 numbers 배열에 넣어준 코드도 있었고,
def solution(numbers, k):
return 2 * (k - 1) % numbers[-1] + 1
아예 값으로 구한 코드도 있었다 !
대 단 쑤 ..!

그래서 오늘은 여기까지 !
알 찼 돠 ..
내일도 화이팅이다 !