0%

Baekjoon Online Judge - 4673

Code (Python)

  • 분해합과 비슷한 문제.
  • 생성자가 없는 숫자를 전부 출력하면 된다.
  • 이래도 되나 싶었는데, 그냥 리스트에 다 집어넣고 집합 연산으로 풀어서 AC가 나왔다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
number_list = []
hap_list = []

for i in range(1, 10001):
hap = 0
number = i
number_list.append(i)

while number != 0:
rest = int(number % 10)
hap += rest
number = int(number/10)
hap += i
hap_list.append(hap)

number_array = sorted(set(number_list) - set(hap_list))
for i in number_array:
print(i)

References 1 (출처)

  • 음. 굳이 리스트를 안 써도 되는구나. 집합 공부해야겠다.
  • 자릿수를 더하는 방식이 신기하다. 수를 string으로 형변환하고 for문으로 자릿수를 전부 더해버렸다. 지난번 분해합에서 봤던 레퍼펀스랑 비슷한데 다른 느낌.
1
2
3
4
5
6
7
8
9
10
11
12
natural_number_set = set(range(1, 10001))
generated_number_set= set()

for i in range(1, 10001):
for j in str(i):
i += int(j)
generated_number_set.add(i)

self_number_set = natural_number_set - generated_number_set

for i in sorted(self_number_set):
print(i)

Baekjoon Online Judge - 7568

Code (Python)

  • 리스트 정렬해서 풀다가 이건 아니다 싶어서 전수 비교
  • 음 그런데 다른 분이 짠 코드 보니까 for문을 리스트 길이로 돌린 게 뻘짓
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
N = int(input())
dungchi_list = []
answer = []

for i in range(N):
dungchi_list.append(list(map(int, input().split())))

for i in range(len(dungchi_list)): # 현재 덩치
count = 1
for j in range(len(dungchi_list)): # 비교할 덩치들
if dungchi_list[i][0] < dungchi_list[j][0]: # 몸무게도 크고
if dungchi_list[i][1] < dungchi_list[j][1]: # 키도 크다면
count = count + 1
answer.append(count)

print(' '.join(map(str, answer)))

References 1 (출처)

1
2
3
4
5
6
7
8
9
10
11
12
13
num_student = int(input())
student_list = []

for _ in range(num_student):
weight, height = map(int, input().split())
student_list.append((weight, height))

for i in student_list:
rank = 1
for j in student_list:
if i[0] < j[0] and i[1] < j[1]:
rank += 1
print(rank, end = " ")

프로그래머스 - 연습 문제

Code1 (Python)

  • answer의 길이가 순환주기의 길이와 같으면 순환주기를 더하는 방식으로 함
  • 이렇게 하니까 쓸데없이 길어지는 것 같았는데…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def solution(answers):
person1 = [1,2,3,4,5]
person2 = [2,1,2,3,2,4,2,5]
person3 = [3,3,1,1,2,2,4,4,5,5]

result = [0, 0, 0]
winner = []

for index, value in enumerate(answers):
if len(answers) > len(person1):
person1 += person1
if len(answers) > len(person2):
person2 += person2
if len(answers) > len(person3):
person3 += person3

if value == person1[index]:
result[0] += 1
if value == person2[index]:
result[1] += 1
if value == person3[index]:
result[2] += 1

for index, value in enumerate(result):
if value == max(result):
winner.append(index + 1)

return winner

Code2 (Python)

  • 이렇게 순환주기로 나눠주면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def solution(answers):
pattern1 = [1,2,3,4,5]
pattern2 = [2,1,2,3,2,4,2,5]
pattern3 = [3,3,1,1,2,2,4,4,5,5]
score = [0, 0, 0]
result = []

for idx, answer in enumerate(answers):
if answer == pattern1[idx%len(pattern1)]:
score[0] += 1
if answer == pattern2[idx%len(pattern2)]:
score[1] += 1
if answer == pattern3[idx%len(pattern3)]:
score[2] += 1

for idx, s in enumerate(score):
if s == max(score):
result.append(idx+1)

return result

프로그래머스 - 연습 문제

Code (Python)

  • 리스트를 정렬한 다음, 합계가 예산보다 작을 경우 리스트 원소를 더함
1
2
3
4
5
6
7
8
9
def solution(d, budget):
d.sort()
sum = 0
answer = 0
for i in d:
sum += i
if sum <= budget:
answer += 1
return answer

Code (Python)

  • 예산보다 합계가 클 경우 리스트의 원소를 pop
  • 그리고 그 리스트의 길이를 리턴
1
2
3
4
5
def solution(d, budget):
d.sort()
while budget < sum(d):
d.pop()
return len(d)

프로그래머스 - 연습 문제

Code (Python)

  • for문과 remove 함수로 풀면 시간 초과 보는 문제
  • for문은 O(n), remove 함수는 O(n)으로 도합 O(n^2)
  • 문제에 시간 제한이 안 나와있는데 O(n^2)면 시간 초과가 나니까 줄여야 함
  • 그래서 집합을 썼는데 푸는 내내 마음에 안 들었다
  • 문제 낸 의도가 이게 아닐 텐데..
1
2
3
4
5
6
7
8
9
10
11
12
def solution(participant, completion):
s1 = set(participant)
s2 = set(completion)

if s1 == s2:
participant.sort()
completion.sort()
for i in range(len(completion)):
if participant[i] != completion[i]:
return participant[i]
else:
return list(s1 - s2)[0]

Code (Python)

  • collections 모듈의 counter 사용. 컨테이너에 동일한 자료가 몇 개인지 파악하는데 사용한다.
  • Counter 객체는 이렇게 뺄 수가 있다고 함. 아무튼 결과적으로 값이 1인 것들만 남는다.
1
2
3
4
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]

Code (Python)

  • 내가 구현하고 싶었던 형태
  • 그냥 for 문 밖에서 return하면 되는 거였구나 (멍청)
1
2
3
4
5
6
7
def solution(participant, completion):
participant.sort()
completion.sort()
for i in range(len(completion)):
if participant[i] != completion[i]:
return participant[i]
return participant[len(participant)-1]

프로그래머스 - 연습 문제

Review

  • 1일 경우를 처리해줘야 한다.
  • 1일 경우 0번 반복이니 0을 리턴하면 됨.

Code (Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(num):
count = 0

while num != 1:
if num % 2 == 0:
num = num / 2
elif num % 2 == 1:
num = num * 3 + 1
count += 1

if count == 500:
return -1
break
return count

프로그래머스 - 연습 문제

Review

  • 입력받은 수를 자릿수대로 배열을 만들어 합계를 구한 다음 입력받은 수를 나누었음.

Code (Python)

1
2
3
def solution(x):
arr = list(map(int, list(str(x))))
return x % sum(arr) == 0

프로그래머스 - 연습 문제

Code (Python)

1
2
3
4
5
6
7
8
9
def solution(arr1, arr2):
answer = []

for i in range(len(arr1)):
list = []
for j in range(len(arr1[0])):
list.append(arr1[i][j] + arr2[i][j])
answer.append(list)
return answer

Baekjoon Online Judge - 10950

Review

  • input, 반복문 연습

Code 1 (Python)

  • 반복 횟수만큼 for문 돌려서 입력받은 다음 직접 더함
1
2
3
4
T = int(input())
for i in range(0, T):
A, B = input().split(' ')
print(int(A) + int(B))

Code 2 (Python)

  • 반복 횟수만큼 for문 돌려서 입력받은 다음 map을 사용해 입력값을 전부 int로 변환시켜 리스트로 저장
  • 그리고 그 리스트의 합계를 sum 함수를 이용해서 구함
  • 입력값을 int로 변환시에 map을 사용하는 이유는, split의 결과를 매번 int로 변환하기 귀찮기 때문
1
2
3
4
T = int(input())
for i in range(T):
answer = list(map(int,input().split()))
print(sum(answer))

References

  • 코딩도장 - 파이썬 입력 값을 변수 두 개에 저장하기