Algorithm 104

[BOJ] 2884 - 알람 시계

문제 https://www.acmicpc.net/problem/2884 문제가 길지만 요약하면 다음과 같다. 시각을 입력으로 받아, 45분 전의 시각을 출력하라. 24시간 표현을 사용하여 시간은 0부터 23까지, 분은 0부터 59까지를 범위로 가진다. 풀이 내 풀이 1. 입력값으로부터 시간과 분을 각각 저장한다. 2. 분의 값이 45 미만인 경우, 분의 값에 15를 더하고 시간의 값을 1 감소시킨다. 시간의 값이 0인 경우에는 23으로 변경한다. 3. 분의 값이 45 이상인 경우, 분의 값에 45를 뺀다. 코드 h, m = map(int, input().split()) if m < 45: m += 15 h = 23 if h == 0 else h - 1 else: m -= 45 print(h, m)​ 다른..

Algorithm/백준 2021.10.25

[BOJ] 2574 - 학점계산

문제 https://www.acmicpc.net/problem/2754 어떤 사람의 C언어 성적을 입력받아 그 평점을 출력하라. 성적에 대한 평점은 아래와 같다. A+ 4.3 A0 4.0 A- 3.7 B+ 3.3 B0 3.0 B- 2.7 C+ 2.3 C0 2.0 C- 1.7 D+ 1.3 D0 1.0 D- 0.7 F 0.0 풀이 1. 내가 푼 방법 성적과 평점을 살펴보면 아래와 같은 사실을 알 수 있다. 성적의 첫 번째 글자가 기본 점수를 결정한다. 성적에 두 번째 글자에 따라 기본 점수에 0.3점을 가감한다. 이 규칙을 활용하기 위해 성적의 첫 번째 글자를 키로 하고 기본 점수를 값으로 하는 딕셔너리 하나와 성적의 두 번째 글자를 키로 하고 가감 점수를 값으로 하는 딕셔너리 하나를 선언하여 값을 계산해 ..

Algorithm/백준 2021.10.22

[BOJ] 2480 - 주사위 세개

문제 https://www.acmicpc.net/problem/2480 1부터 6까지의 눈을 가진 주사위 세 개를 던져 아래와 같은 규칙에 따라 상금을 받는 게임이 있다. 같은 눈이 3개인 경우 상금은 10,000원 + 같은 눈의 값 * 1,000원 같은 눈이 2개인 경우 상금은 1,000원 + 같은 눈의 값 * 100원 모두 다른 눈이 나온 경우 상금은 가장 큰 눈의 값 * 100원 주사위 3개의 눈의 값이 입력으로 주어질 때, 상금의 값을 출력하라. 풀이 본인이 푼 것 사용한 언어는 파이썬이다. 좀 복잡하게 풀었다. 방법은 아래와 같다. 1. 주사위 눈 값 3개를 리스트에 저장한다. 2. 주사위 눈 값을 키로, 그 개수를 값으로 하는 딕셔너리를 선언 및 초기화한다. 3. 딕셔너리의 길이를 구한다. 4..

Algorithm/백준 2021.10.21

[BOJ] 11653 - 소인수 분해

문제 정수 N이 주어졌을 때 소인수 분해하는 프로그램을 작성한다. https://www.acmicpc.net/problem/11653 소인수분해 prime factorization 소수(prime)란 1과 자기 자신으로만 나누어 떨어지는 정수를 뜻하며, 인수화(factorization)란 어떤 수를 인수로 분해하는 것을 의미한다. 즉, 소인수분해는 어떤 수를 소수인 인수로 분해하는 것이다. 풀이 풀이 1. 2부터 N까지 모든 수에 대하여 나머지가 0인 경우 값을 출력한다. 코드 n = int(input()) divider = 2 while n != 1: if n % divider == 0: print(divider) n //= divider else: divider += 1 이 방법은 불필요한 반복이 많..

Algorithm/백준 2021.10.19

[BOJ] 7287 - 등록

문제 백준 온라인 저지에서 맞은 문제의 수와 이이디를 그대로 출력하는 프로그램 작성 입력은 없으며, 첫 줄에 맞은 문제의 수, 둘째 줄에 아이디를 출력한다. 풀이 백준 사이트로부터 값을 받아서 출력하는 문제가 아니라, 사용자가 직접 자신이 맞은 문제의 수와 아이디를 확인하여 출력하면 된다. 본인의 아이디와 맞은 문제에 대한 정보는 사이트 오른쪽 상단 아이디를 클릭하면 확인할 수 있다. 임의의 숫자나 문자열을 넣으면 틀린 것으로 채점한다니, 채점 시 출력 값과 실제값을 비교하는 모양이다. 풀이 코드 Python3을 사용했다. 직접 문제 수를 세고 싶지 않아 맞은 문제 목록을 복사하여 문자열로 저장한 뒤, 공백을 기준으로 자른 후 반환 배열의 길이를 출력하도록 했다. quest = "1000 1001 100..

Algorithm/백준 2021.10.17

[응용 문제] 최대 수익 알고리즘

문제 어떤 주식의 특정 기간 동안의 가격 변화가 주어졌을 때, 그 주식 한 주를 한 번 사고팔아 얻을 수 있는 최대 수익을 계산하라. 가격의 최대값과 최솟값을 구한 뒤 계산하는 것으로는 이 문제를 해결할 수 없다. 파는 행위가 사는 행위 후에 발생해야 하기 때문이다. 내 풀이 리스트의 첫번째 값을 빼서 구매금액으로 하고, 리스트의 나머지 값 중 최댓값을 판매금액이라고 한다. 판매금액과 구매금액의 차가 현재 최대 수익보다 크면 최대 수익 금액을 갱신한다. 이 반복은 리스트에 자료가 한 개 남으면 종료한다. def max_benefit(list): benefit = 0; while len(list) > 1: buy = list.pop(0) sell = max(list) if sell - buy > benef..

[응용 문제] 가짜 동전 찾기 알고리즘

문제 좌우 무게를 비교할 수 있는 양팔 저울을 이용해 겉보기에 똑같은 동전 n개 중, 싸고 가벼운 재료로 만들어진 가짜 동전을 찾아라. 조건 저울질에 해당하는 부분은 아래 함수와 같다. 구현하고자 하는 알고리즘은 아래의 weight 함수를 통해 가짜 동전의 위치를 찾아야 한다. def weight(a, b, c, d): fake = 29 if a

[응용 문제] 미로 찾기 알고리즘

모델링 (모형화) 주어진 현실의 문제를 정형화하거나 단순화하여 수학이나 컴퓨터 프로그램으로 쉽게 설명할 수 있도록 표현하는 것 자연이나 사회현상을 사람의 언어로 표현한 문제를 컴퓨터가 이해할 수 있는 수학식이나 프로그래밍 언어로 번역하는 철차 아래와 같은 그림으로 출발점과 도착점이 주어졌을 때 출발점에서 도착점까지 가기 위한 최단 경로를 찾는 알고리즘을 구현하라. 위 문제를 모델링하면 a에서 출발해 p로 도착하는 최단 경로를 구하고, 그 경로를 출력하라. 미로는 그래프를 이용해 정의한다. 각 위치를 꼭짓점으로, 각 위치에서 직접 연결된 위치를 선으로 하는 그래프를 정의하면 된다. 코드 maze_info = { 'a': ['e'], 'b': ['c', 'f'], 'c': ['b', 'd'], 'd': ['..

[자료 구조] 친구의 친구 찾기 / 그래프

그래프 (Graph) 꼭짓점(vertex)과, 그 꼭짓점 사이를 연결한 선(edge)의 집합 파이썬에서는 그래프를 표현할 수 있는 다양한 방법이 있지만, 이 글에서는 딕셔너리와 리스트를 이용한다. 꼭짓점을 key로 정의하고, 직접 연결된 꼭짓점 list를 value로 정의한 딕셔너리를 선언하여 그래프를 표현할 수 있다. fr_info = { "Summer": ["John", "Justin", "Mike"], "John": ["Summer", "Justin"], "Justin": ["John", "Summer", "Mike", "May"], "Mike": ["Summer", "Justin"], "May": ["Justin", "Kim"], "Kim": ["May"], "Tom": ["Jerry"], "Je..

[자료 구조] 동명이인 찾기 / 딕셔너리

딕셔너리(dictionary, 사전) 정보를 찾는 기준이 되는 키(key)와 키에 연결된 값(value)의 대응 관계를 저장하는 자료 구조 key-value 형태의 자료구조를 해시 테이블(Hash Table)이라고 하며, 프로그래밍 언어마다 다르게 불릴 수 있다. C++에서는 unordered_map, Java에선 haspmap이라고 부른다. 코드 # 빈 딕셔너리 선언 d = {} d = dict() # 선언과 동시에 초기화 d = { KEY1: VALUE1, # 키와 값은 콜론으로 구분 KEY2: VALUE2, # 키와 키는 쉼표로 구분 KEY3: VALUE3, KEY4: VALUE4 } # d 자료 개수 확인 len(d) # 값 찾기 d[KEY] # 값 추가. 키 중복 미허용. 기존 값이 있는 경우 ..