Skip to content

Commit 031abb3

Browse files
authored
Merge pull request #235 from AlgorithmStudy-Allumbus/minjeong3
Minjeong / 7월 2주차 / 4문제
2 parents 06d1790 + c6c2522 commit 031abb3

File tree

4 files changed

+111
-0
lines changed

4 files changed

+111
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
def solution(brown, yellow):
2+
carpet_size = brown + yellow # 카펫의 전체 크기
3+
4+
for w in range(1,int(carpet_size**0.5)+1): # 약수 범위 설정. 여기서 w는 너비를 의미함
5+
if carpet_size % w == 0: # 약수라면
6+
h = carpet_size // w # 전체 크기에서 너비로 나눈 값을 높이로 설정
7+
8+
if (2*w + 2*h - 4 == brown) and ((w-2)*(h-2) == yellow): # 조건에 해당하는지 확인
9+
return [max(w, h), min(w, h)]
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""
2+
풀이1
3+
"""
4+
def solution(n):
5+
"""
6+
이동방법
7+
1. K칸 앞으로 점프 => 건전지 사용량 -K
8+
2. 순간이동: (현재까지 온 거리) * 2 => 건전지 사용량 X
9+
목표
10+
- 거리가 N만큼 떨어져있는 장소로 간다고 했을 때 건전지 사용량의 최솟값을 구하기
11+
"""
12+
ans = 0
13+
while n > 0:
14+
if (n % 2 == 0):
15+
n //= 2
16+
else:
17+
n -= 1
18+
ans += 1
19+
return ans
20+
21+
"""
22+
풀이2
23+
"""
24+
def solution(n):
25+
return bin(n).count('1')
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import java.util.*;
2+
3+
/*
4+
1. n번쨰 글자를 기준으로 오름차순 정렬.
5+
2. 만약 같은 경우 사전순으로 앞선 문자열이 앞으로 와야 한다.
6+
풀이 시간: 30분
7+
*/
8+
class Solution {
9+
public String[] solution(String[] strings, int n) {
10+
// n번쨰 기준으로 정렬하기 전에 전체 정렬
11+
Arrays.sort(strings);
12+
13+
// n번째 글자를 기준으로 오름차순 정렬
14+
Arrays.sort(strings, new Comparator<String>() {
15+
@Override
16+
public int compare(String s1, String s2) {
17+
int index = n;
18+
char c1 = s1.charAt(index);
19+
char c2 = s2.charAt(index);
20+
return Character.compare(c1, c2);
21+
}
22+
});
23+
return strings;
24+
}
25+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
def solution(str1, str2):
2+
"""
3+
1. 다중집합 만들기
4+
- 문자열을 2글자씩 끊기
5+
- 두 글자가 모두 알파벳일 때에만 저장하기 (`isalpha()` 이용)
6+
- 대소문자 구분이 없으므로 모두 대문자 또는 소문자 둘 중 하나로 통일하기 (`upper()` or `lower()` 이용)
7+
2. 다중집합 간의 교집합과 합집합 구하기
8+
- 다중집합은 중복된 원소를 포함할 수 있다. 따라서 `remove()`를 이용해서 하나씩 비교하며 처리한다.
9+
- 교집합: A 집합과 B 집합의 공통된 원소를 제거해가면서 교집합을 저장할 리스트(`intersect`)에 저장한다
10+
- 합집합: A의 차집합(A - B) + B의 차집합(B - A) + 교집합으로 구성한다.
11+
3. 자카드 유사도 구하기
12+
- 합집합이 공집합일 경우(=합집합 리스트 길이가 0), 유사도는 1로 처리한다.
13+
- 그게 아닐 경우, `교집합 / 합집합`
14+
4. 정답 반환
15+
- `자카드 유사도 * 65536` 의 정수 부분을 반환한다.
16+
"""
17+
# 1. 다중집합 만들기
18+
a = []
19+
for i in range(len(str1) - 1):
20+
if str1[i:i + 2].isalpha():
21+
a.append(str1[i:i + 2].upper())
22+
23+
b = []
24+
for i in range(len(str2) - 1):
25+
if str2[i:i + 2].isalpha():
26+
b.append(str2[i:i + 2].upper())
27+
28+
# 2.1. 다중합집합 구하기
29+
union_set = a.copy()
30+
a_minus_b = a.copy() # A의 차집합
31+
32+
for i in b:
33+
if i not in a_minus_b: # b에는 있지만 a에 있는 건 b의 차집합이다. 따라서 Union에 추가한다.
34+
union.append(i)
35+
else: # a_minus_b는 a의 차집합으로 b와 중복되는 게 있다면 지워야 한다.
36+
a_minus_b.remove(i)
37+
38+
# 2.2. 다중교집합 구하기
39+
inter_set = []
40+
for i in b:
41+
if i in a:
42+
a.remove(i)
43+
inter_set.append(i)
44+
45+
# 3. 자카드 유사도 계산
46+
if len(union) == 0: # 합집합이 0이라면
47+
return 65536
48+
49+
similarity = len(inter_set) / len(union)
50+
51+
# 정답 출력
52+
return int(similarity * 65536)

0 commit comments

Comments
 (0)