전체 글 267

[Java] 완주하지 못한 선수

문제 https://school.programmers.co.kr/learn/courses/30/lessons/42576 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 과정 해시맵을 활용하면 간단히 풀 수 있는 문제였다. 처음엔 value를 Boolean 값으로 주려 했으나, 이름이 중복될 수 있다는 것을 깨닫고 횟수로 변경하였다. 해시맵에 참가자들의 이름을 key로, 이름 조회 횟수를 value로 넣어준다. (이름이 중복이 아닌 경우는 value가 1, 중복인 경우는 n이 됨) 해시맵에서 완주한 사람들의 value를 -1 해준다. 해시맵에서 valu..

[Java] 올바른 괄호

문제 https://school.programmers.co.kr/learn/courses/30/lessons/12909 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 과정 스택을 활용하여 풀었다. 여는 괄호(()라면 스택에 넣어준다. 닫는 괄호라면()) 스택 제일 위가 여는 괄호인지 확인한다. 여는 괄호라면 스택에서 꺼낸다. (짝이 맞으니 없애기) 닫는 괄호라면 올바른 괄호가 아니므로 false를 반환한다. 스택이 비었다면 true를 그렇지 않다면 올바른 괄호가 아니므로 false를 반환한다. 이 문제는 스택 / 큐 카테고리로 분류되어 있지만, 스택..

[Python] H-Index

문제 https://school.programmers.co.kr/learn/courses/30/lessons/42747 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이과정 문제 이해가 잘 가지 않아 H-Index에 대해 찾아보게 되었고, H-Index 설명대로 구현하니 해결할 수 있었다. H-Index 구하는 법 : 연구자의 전체 논문을 피인용 순으로 정렬한 후, 논문의 순번과 피인용 횟수를 비교하여 피인용 횟수가 논문의 순번보다 작아지기 시작하는 직전의 순번이 연구자의 H-Index가 된다. 참고 링크 ➡︎ https://www.ibric.org/m..

[Python] 17609. 회문

문제 https://www.acmicpc.net/problem/17609 17609번: 회문 각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다. www.acmicpc.net 풀이 과정 투 포인터 방식으로 풀었다. 두 개의 포인터를 맨 왼쪽과 맨 오른쪽에 놓고 한 칸씩 이동하면서 회문인지 유사회문인지 일반 문자열인지 판별하였다. 코드 # 회문인지 체크하는 함수 def check_palindrome(l, r): while l < r: if string[l] != string[r]: return False l += 1 r -= 1 return True t = int(input()) for _ in..

Algorithm/Baekjoon 2022.09.22

[Python] 24553. 팰린드롬 게임

문제 https://www.acmicpc.net/problem/24553 24553번: 팰린드롬 게임 첫째 줄에 테스트 케이스의 개수 $T$가 주어진다. ($1 \le T \le 1\,000$) 둘째 줄부터 $T$개의 줄에 걸쳐, 돌 무더기에 쌓여 있는 돌의 개수 $N$이 주어진다. ($1 \le N \le 10^{18}$) www.acmicpc.net 풀이 과정 시간제한을 보고 구현은 아니겠다고 생각했는데, 그리디 방법을 찾는 것에 시간이 걸렸다. 그것은 주어진 돌의 개수 n이 10의 배수인지 아닌지로 바로 판단할 수 있다. n이 10의 배수인 경우는 승우가 아무리 머리를 쓰더라도 상윤이가 이기게 된다. 예) n = 10 / 승: 9(승우가 몇 개를 가져와도 나머지가 생김) / 상윤: 1 ➡︎ 상윤 승..

Algorithm/Baekjoon 2022.09.19

[Python] 3048. 개미

문제 https://www.acmicpc.net/problem/3048 3048번: 개미 T초가 지난 후에 개미의 순서를 출력한다. 첫 번째 개미 그룹은 왼쪽에서 오른쪽으로 움직이고, 두 번째 그룹은 반대 방향으로 움직인다. www.acmicpc.net 풀이 과정 딕셔너리로 풀까, 한 칸씩 이동하도록 할까 등 여러 가지 방식을 고민하다가 0으로 채워진 리스트에 개미들을 넣는 방식으로 풀었다. 그래서 개미들을 각 자리에 맞게 넣어주도록 계산하는 것이 중요했다. 개미들이 들어갈 리스트를 만들어준다. 이때, 각 그룹마다 개미들을 두 칸씩 띄워 넣어줄 것이기 때문에 넉넉한 크기로 만들어준다. 첫 번째 그룹 개미들을 넣는데, 시간(t) 자리부터 넣어준다. (t * 2 ~ t * 2 + n1 * 2) (두 칸씩 띄..

Algorithm/Baekjoon 2022.09.18

[Python] 20057. 마법사 상어와 토네이도

문제 https://www.acmicpc.net/problem/20057 20057번: 마법사 상어와 토네이도 마법사 상어가 토네이도를 배웠고, 오늘은 토네이도를 크기가 N×N인 격자로 나누어진 모래밭에서 연습하려고 한다. 위치 (r, c)는 격자의 r행 c열을 의미하고, A[r][c]는 (r, c)에 있는 모래의 양을 www.acmicpc.net 풀이과정 구현문제로 토네이도 방향이 변화하는 것과 퍼지는 비율을 토네이도 방향대로 돌려주는 것이 핵심이다. 코드 import sys sys.stdin = open('input.txt') # 모래 이동 비율 ratio = [[0, 0, 0.02, 0, 0], [0, 0.1, 0.07, 0.01, 0], [0.05, 0, 0, 0, 0], [0, 0.1, 0.07..

Algorithm/Baekjoon 2022.09.15

[Python] 2211.네트워크 복구

문제 https://www.acmicpc.net/problem/2211 2211번: 네트워크 복구 첫째 줄에 두 정수 N, M이 주어진다. 다음 M개의 줄에는 회선의 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 컴퓨터와 B번 컴퓨터가 통신 시간이 C (1 ≤ C ≤ 10)인 회선으로 연결되어 있다 www.acmicpc.net 풀이과정 컴퓨터와 시간을 주고 최소 시간으로 모든 컴퓨터를 연결해야 한다. 그리고 연결하는 횟수와 연결할 컴퓨터의 번호를 출력하는 문제이다. 따라서 노드와 거리(시간)이 있고 최단 거리 찾기라고 생각하여 다익스트라 알고리즘을 활용하여 풀었다. 처음에는 for문으로 dijkstra 함수를 모든 컴퓨터에서 시작시켜서 거기서 가장 시간이 적게 드는 곳을 연결해야지 라고 ..

Algorithm/Baekjoon 2022.08.24

[Python] 9935. 문자열 폭발

words = input() # 입력받은 문자열 explode = list(input()) # 폭발 문자열 exp_l = len(explode) new_words = [] for word in words: new_words.append(word) # 기존 문자열의 단어 하나를 새 리스트에 추가 # new_words의 마지막 글자가 폭발 문자열의 마지막 글자와 같고, # 그래서 끝의 글자들이 폭발 문자열과 같다면 if new_words[-1] == explode[-1] and new_words[-exp_l:] == explode: for _ in range(exp_l): # 폭발 시키기 (문자 제거) new_words.pop() if new_words: # 문자 남아있다면 문자열로 변환하여 print pr..

Algorithm/Baekjoon 2022.01.17

[Python] 1339. 단어 수학

n = int(input()) # 단어의 개수 words = [[] for _ in range(8)] # 단어를 자리 수별로 저장할 리스트 word_dic = {} # 단어 값을 넣을 딕셔너리 for i in range(n): word = input() # 단어 입력받기 len_word = len(word) for j in range(len_word): words[7-j].append(word[len_word-j-1]) # words에 자리 별로 단어 넣어주기 word_dic[word[j]] = word_dic.get(word[j], 0) + 10 ** (len_word-j-1) # 해당 자리에 맞는 값 넣기 numbers = [] for num in word_dic.values(): # 알파벳 빼고 값..

Algorithm/Baekjoon 2022.01.15