Day8
- 간단한 논리 연산
- 주사위 게임 3
- 글자 이어 붙여 문자열 만들기
- 9로 나눈 나머지
- 문자열 여러 번 뒤집기
간단한 논리 연산
문제 설명
boolean 변수 x1, x2, x3, x4가 매개변수로 주어질 때, 다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요.
(x1 ∨ x2) ∧ (x3 ∨ x4)
def solution(x1, x2, x3, x4):
return (x1 or x2) and (x3 or x4)
주사위 게임 3
문제 설명
1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
며칠 전에 풀었던 주사위 게임 풀이에서 set 함수로 중복된 값을 추리고 len 함수로 개수를 알아내 문제를 풀었던 기억이 있다. 이 방식으로 접근해보았을 때
- p p p p > 1
- p p p q > 2
- p p q q > 2
- p p q r > 3
- p q r t > 4
> 값이 2로 동일할 때 어떻게 구분할 것인가?
> p p q r 일 때의 연산이 q * r 인데 어떤게 p,q,r을 어떻게 구분할 것인가? 의 문제가 생겼다 ..... 음
def solution(a, b, c, d):
answer = 0
lst = [a,b,c,d]
length = len(set(lst))
count = [lst.count(i) for i in lst]
if length == 1: answer = 1111 * a
elif length == 4 : answer = min(a,b,c,d)
elif length == 2:
if 3 in count:
p = [lst[index] for index, value in enumerate(count) if value == 3]
q = [lst[index] for index, value in enumerate(count) if value == 1]
answer = (10 * p[0] + q[0])**2
else:
answer = (a + c) * abs(a - c) if a == b else (a + b) * abs(a - b)
else:
answer_values = [lst[index] for index, value in enumerate(count) if value == 1]
answer = answer_values[0] * answer_values[1]
return answer
머리 쥐어짜내가며 짠 코드 ..뇌절코드.. 한시간 넘게 걸려서 짠......코드예요 ....
1. length가 2일 때
1-1. p p p q 인 경우 count가 3임
1-2. p p q q 인 경우, a==b면 c==d이기 때문에 어차피 값이 2개밖에 없으니 a,c를 p,q로 활용해서 연산
2. length가 3일 때, p p q r 인 경우
count값이 1 > q, r 을 구해야하므로
값이 1을 만족할 때의 인덱스를 사용해서 lst에서 값을 구함.
아우 어렵게도 짰다 그쵸 ..
암튼 [lst[index] for index, value in enumerate(count) if value == n] 이 코드를 위주로 생각해서 짰고,
value가 n을 만족할 때의 인덱스를 사용해서 값을 구한 것입니다!
def solution(a, b, c, d):
l = [a,b,c,d]
c = [l.count(x) for x in l]
print(c)
if max(c) == 4:
return 1111*a
elif max(c) == 3:
print(l[c.index(3)])a
return (10*l[c.index(3)]+l[c.index(1)])**2
elif max(c) == 2:
if min(c) == 1:
return eval('*'.join([str(l[i]) for i, x in enumerate(c) if x == 1]))
else:
return (max(l) + min(l)) * abs(max(l) - min(l))
else:
return min(l)
다른 사람 풀이:
애초에 4,3,2,1의 기준값을 나눈 것부터 나랑 달랐다.
나는 set을 기준으로 나누었는데 다른사람들은 count함수를 기준으로 나누었다.
다른 부분이 예를들어 p p p q 라면 set은 > p, q만남고 값이 2가 되는데
count를 사용해서 lst 배열대로 남겨두 [3, 3, 3, 1]이 되어 max(c)를 하였을 때 값이 3이 나온다.
이렇게 해야 뒤에서 인덱스를 구할 때 편해서 이 방법이 훨씬 ... 나은 것 같다.
내가 푼 방법은 하나하나 계산을 한 느낌이랄까 ....
count랑 index함수를 사용한 풀이를 제대로 처음본 것 같다.
c = [l.count(x) for x in l] : 리스트의 특정 원소 개수를 세서 c에 저장한다.
1. max(c) == 4일 때, 특정 원소 개수가 4개일 때 > 모두 같은 값
2. max(c) == 3일 때, 특정 원소 개수가 3개일 때 > 3개 같은 값, 1개만 다름
3. max(c) == 2일 때
3-1 min(c)는 1일 때 p p q r 인 경우
c의 값이 1일 때의 인덱스를 구해서 두 값을 곱함
3-2 p p q q 인 경우
값이 어차피 2개이니 list에서 최솟값과 최댓값을 이용해 p, q로 보고 계산
어려운데 .. 그래도 새로운 것을 알아가는 것 같아서 좋슴니다.
비록 제 시간은 훅.. 날아가버렸지만요 ㅠ
글자 이어 붙여 문자열 만들기
문제 설명
문자열 my_string과 정수 배열 index_list가 매개변수로 주어집니다. my_string의 index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string, index_list):
return ''.join(my_string[i] for i in index_list)
9로 나눈 나머지
문제 설명
음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.
def solution(number):
return int(number) % 9
사실 그냥 이렇게 풀었는데
이렇게 푸는 게 정석은 아니었나보다.
def solution(number):
return sum(list(map(int, number))) % 9
문제에서 팩트는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것
문자열 여러 번 뒤집기
문제 설명
문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다. queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다. my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(my_string, queries):
for s, e in queries:
my_string = my_string.replace(my_string[s:e+1], my_string[s:e+1][::-1])
return my_string
인덱스 s~e 부분을 뒤집어서 replace함수로 대체하는 방법을 사용했는데, 반례가 계속 나와서 결국 방법을 바꿨다.
def solution(my_string, queries):
for s, e in queries:
my_string = my_string[:s] + my_string[s:e+1][::-1] + my_string[e+1:]
return my_string
replace 함수를 사용하지 않고 슬라이싱만 이용해서 s~e부분을 뒤집고 앞뒤로는 그대로 가져가기
문제들 난이도가 오락가락하는게 병주고 약주는 건가 ..... 주사위 문제에서 멘탈나갔는데 3,4,5는 그래도 순탄히 풀리고,, 이게 완전 기초일텐데 다른 건 얼마나 어려울까 .....ㅎㅎㅎㅎㅜㅜㅜ 어제 삼전 sw 어쩌고 신청을 해놔서 사전 문제 풀려고 봤는데 진짜 도저히 모르겠더라고요 ..... 그래두 꾸준히 해보자 아자잣
'코테' 카테고리의 다른 글
프로그래머스 기초문제 Day10 문자열 (1) | 2024.01.10 |
---|---|
프로그래머스 기초문제 Day9 문자열 (1) | 2024.01.09 |
프로그래머스 기초문제 Day7 반복문 (1) | 2024.01.07 |
프로그래머스 기초문제 Day6 조건문, 반복문 (1) | 2024.01.06 |
프로그래머스 기초문제 Day5 조건문 (1) | 2024.01.05 |