알고리즘2022. 2. 26. 23:47
728x90

[ 문제 ]

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

 

 

[ 코드 ]

def solution(phone_book):
    dic = {}
    for num in phone_book:
        dic[num] = 1 #기본 값
    
    # 각 폰 번호에 대해
    for n in phone_book: # ex. 123
        str_num = ''   
        for i in n:     # ex. 1/ 2/ 3
            str_num += i
            # 하나씩 자른게 딕셔너리에 있는지 확인 (단, 본인은 아닌거)
            if (str_num in dic) and (str_num != n):
                return False #처음에 answer=True 하고 return answer해도 되지만 이게 더 빠름
    return True
반응형
Posted by mminky
알고리즘2022. 2. 26. 21:39
728x90

* 해시는 파이썬의 딕셔너리로 구현한다.

즉, 해시 문제'딕셔너리'를 이용하기!!

 

* 출제 빈도높고 점수보통 이라고 한다. (출처: 프로그래머스)

 

 

[ 문제 ]

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

https://programmers.co.kr/learn/courses/30/lessons/42576

 

코딩테스트 연습 - 완주하지 못한 선수

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수

programmers.co.kr

 

 

 

[ 풀이 ]

def solution(participant, completion):
    dic = {} # '해시' : 딕셔너리 이용
    
    # 참가자 이름별로 세기 (동명이인 두 명이면 2)
    for i in participant:
        if i in dic.keys():
            dic[i] += 1
        else:
            dic[i] = 1
    #return dic #결과값 {"leo":1,"kiki":1,"eden":1}
    
    # 완주자 명단에 있으면 -1
    for j in completion:
        if j in dic.keys():
            dic[j] -= 1
    #return dic #결과값 {"leo":1,"kiki":0,"eden":0}
    
    for k in dic:
        if dic[k] == 1: # != 0 이 더 정확할 것 같다. (0이 완주이기 때문)
            return k

 

반응형
Posted by mminky
알고리즘2022. 2. 23. 23:25
728x90

[ 문제 ]

https://www.acmicpc.net/problem/11047

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

 

 

[ 내가 푼 코드 ]

문제가 풀리기는 했으나 Greedy 알고리즘을 이용하지는 못했음

더보기
n,k = map(int,input().split())
a = []
coin = 0
for _ in range(n):
    a.append(int(input()))
a.sort(reverse=True)

for i in a:
    if k >= i:
        if k%i ==0:
            coin += k//i
            break
        coin += k//i
        k = k%i

print(coin)

 

 

[ 해결 아이디어 ]

 

* 그리디(탐욕) 알고리즘

: 눈 앞의 이익만 우선 추구하는 알고리즘

( greedy : 탐욕스러운, 욕심이 많은 )

 --> knapsack문제, 동전 문제(각 동전은 작은 동전의 배수)

 

 

입력에 보면 Ai는 Ai-1의 배수 라는 조건이 있다.

즉, 동전이 1, 5, 10, 50, 100 .. 이런 식으로 큰 동전은 작은 동전의 배수가 된다.

이러한 유형은 GREEDY 알고리즘으로 해결 할 수 있다.

 

 

[ 해결 코드 ]

n,k = map(int,input().split())
a = []
coin = 0
for _ in range(n):
    a.append(int(input()))
a.sort(reverse=True)

# GREEDY
for i in a:
    coin += k//i
    k = k%i
print(coin)

 

 

[ 결과 ]

반응형
Posted by mminky
알고리즘2022. 2. 23. 17:02
728x90

[ 문제 ]

https://www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

 

[ 코드 ]

n = int(input())
p = list(map(int,input().split()))
p.sort()

total = 0
for i in p:
    total += i*n
    n -= 1

print(total)

 

 

[ 결과 ]

반응형
Posted by mminky
알고리즘2022. 2. 23. 15:53
728x90

[ 문제 ]

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

 

 

[ 코드 ]

n = int(input())
bag = 0

while 1:    # 계속 반복함
    if n%5 == 0:    #5의 배수이면
        bag += n//5 #몫 만큼 bag에 더함
        break       #n이 5의 배수이면 몫 만큼의 가방만 필요하므로 끝!
                # (예) n=10이라면 n//5 = 2 -> 2개의 가방만 있으면 됨
    # 예외처리
    if n<3:
        bag = -1
        break
    # 3kg은 빼주면서 가방 하나씩 더함
    n -= 3
    bag += 1

print(bag)

 

 

[ 결과 ]

반응형
Posted by mminky
알고리즘2022. 2. 23. 15:48
728x90

코딩테스트를 준비하기 위해 백준사이트를 이용하려고 하는데

어떻게 이용해야할지 고민이었다.

그러다 검색을 통해 결론을 도출했다.

 

1. 백준 사이트

그리디, 탐색, 다이나믹(동적) 프로그래밍 문제 풀기

2. 프로그래머스

코딩테스트 연습 ( https://programmers.co.kr/learn/challenges )

 

( 한 문제당 소요시간은 45분으로 잡는다! )

 

 

--------------------------------------------------------------------------------------------------------

 

우선, 백준 사이트에서 원하는 알고리즘 별로 문제를 연습하는 방법이다.

문제 > 알고리즘 분류 로 들어간다.

 

여기서 원하는 알고리즘을 선택한다.

 

원하는 문제를 클릭하고 풀면 된다!

 

ex) 백준 - 그리디 알고리즘 모음

https://www.acmicpc.net/problemset?sort=ac_desc&algo=33 

 

문제 - 1 페이지

 

www.acmicpc.net

 

반응형
Posted by mminky
기타2021. 12. 16. 16:11
728x90

셀 서식을 이용해서 셀 너비만큼 특정한 문자로 채우는 방법 입니다.

 

아래의 '수량'필드에는 제품마다 수량의 자릿수가 다르다는 것을 알 수 있습니다.

이 때 남는 자리만큼 ' - '기호를 이용해서 채워보겠습니다!

원본 데이터

[ 요약 ]

셀서식 > 사용자지정 > 형식에서

*반복할 문자 이렇게 입력하면 된다! (공백을 반복하고 싶다면 * 이런식으로)

 

 


[ 방법 ]

우선 서식을 적용 할 수량필드의 셀들을 선택하고 우클릭을 해서 셀서식으로 들어갑니다.

사용자 지정 > 형식에 입력합니다.

 

저는 빈 칸 만큼 ' - '를 채우기 위해서 다음과 같이 입력했습니다.

*-#

*다음의 -를 빈 자리만큼 반복하고 숫자인 #을 표시한다. 라는 의미 입니다.

 

 

결과를 보면 다음과 같이 각기 다른 개수의 - 가 칸 너비만큼 채워진 것을 볼 수 있습니다.

이 상태에서 셀 너비를 늘리면 ' - '가 또 늘어납니다.

 

 

반응형
Posted by mminky
기타2021. 12. 16. 11:57
728x90

조건부 서식에서 식도 제대로 입력했는데 적용이 되지 않는다면 주소의 절대화를 알아볼 필요가 있습니다!

 

* 아래의 표에서

국어점수가 80점 이상이고 수학점수가 85점 이상인 사람의 전체 행을 초록색으로 칠해보겠습니다.

 

[ 이유 1 ]

,에 둘 다 절대화가 되어있을 경우

=AND( $D$3 >=80 , $F$3 >=85 )

 

아래와 같이 서식이 적용되지 않는다.

 

[ 이유 2 ]

, 에 둘 다 절대화가 없을 경우

=AND( D3 >= 80 , F3 >= 85 )

 

아래와 같이 이상하게 적용된다.

 

 

해결방법은 다음과 같다!

 

[ 이렇게 바꾸기!! ]

에만 절대화가 되어야 내려가면서 적용됩니다!

=AND( $D3 >= 80 , $F3 >= 85 )

반응형
Posted by mminky