-
[프로그래머스] 01문자열,02재귀,03해쉬(셋,맵)코테공부 2025. 2. 5. 20:04
[01] 문자열
실습문제 04 반지
반지는 문자열의 시작과 끝이 연결된 형태로 글자가 새겨져 있습니다.
순환구조로 생각해서 문자열 처리에 고민을 많이함
스택으로 push pop 잇는 방법을 생각했는데 너무 복잡함 => 문자열 두번 이어붙이는 걸로 해결
from collections import deque def solution(wordfind, N, ring): answer = 0 for myStr in ring: myRing=myStr+myStr if wordfind in myRing: answer+=1 return answer
실습문제 04 우선순위
location을 생각하는 아이디어가 떠오르지않음
location은 하나씩 pop될때마다 -1씩 감소하고,
내 차례였는데 우선순위가 아니었다면 location이 음수가 됨
내 차례인 프로세스는 맨뒤로 돌아갔으니 len(q)-1을 생각하는게 중요함.
# from collections import deque def solution(priorities, location): answer = 0 q=priorities while(q): myMax=max(priorities) temp=q.pop(0) location-=1 if temp >= myMax: answer+=1 #실행 if location<0: break else: q.append(temp) if location<0: location=len(priorities)-1 return answer
[02] 재귀
실습문제01 바둑판
바둑판 종료 조건 다시 생각해볼것
문제 설명
바둑을 좋아하는 다원이는 바둑판을 바라보다가 갑자기 궁금해 졌습니다.
크기가 다른 바둑판의 정가운데 바둑돌을 두고 그 바둑돌을 중심으로 십자가 모양을 그린다음 같은 규칙으로 각 4개의 새로운 공간에 다시 정 가운데 바둑돌을 두면 몇개까지 둘 수 있는지 알고싶어합니다.
하나하나 바둑돌을 두면서 셀 수도 있지만 크기가 큰 바둑판은 아무래도 너무 많은 시간이 걸릴꺼 같습니다. 프로그램을 작성해 봅시다.
다원이는 자신의 n * m크기의 바둑판에 바둑돌을 두려고 합니다.(각각 1,000,000이하)
정 가운데에 둘 수 있을 경우에만 바둑돌은 놓고 그렇지 않는경우는 멈춥니다.예를 들어, n = 7, m= 15일 경우 다원이의 바둑판은 다음과 같이 변합니다.
.은 바둑돌을 놓을 수 있는자리, c는 바둑돌을 나타냅니다.
이 밭에서는 바둑돌이 21개가 필요합니다, 하지만 55크기의 밭에서는 22의 정중앙이 없기 때문에 바둑돌은 하나만 있으면 됩니다.
다원이를 도와서 다원이의 바둑판에 바둑돌이 몇개나 필요한지 계산하는 프로그램을 작성해주세요.
#입력과 출력을 자유롭게 작성해주세요 def f(low, col): if low%2==0 or col%2==0: return 0 #자유롭게 코딩하세요 return 1+4*f(low//2,col//2) low, col = map(int, input().split()) print(f(low, col))
[03]Hash/Set
개념
#set mySet=set() mySet.add(1)#요소추가 mySet.add(2) mySet.update([3,4,5]) #여러요소추가 mySet.discard(2) #없어도 오류안남, remove()는 요소 없을 경우 오류남 #리스트에서 중복 제거하려면? #리스트 -> set -> 리스트 numbers=[1, 2, 2, 3, 4, 4, 5] unique_numbers=list(set(numbers)) print(unique_numbers) #두 리스트의 중복 요소를 찾으려면? list1=[1,2,3,4] list2=[2,4,5,6] print(set(list1) & set(list2))
Hash/Map
def solution(n): answer = 0 text = "apple banana apple cherry banana apple" word_count = {} #단어의 빈도수 계산 for word in text.split(" "): word_count[word]=word_count.get(word,0)+1 print(word_count) #공통된 키값 찾기 dict1 = {"a": 1, "b": 2, "c": 3} dict2 = {"b": 2, "c": 4, "d": 5} common = {k: dict1[k] for k in dict1.keys() & dict2.keys() if dict1[k]==dict2[k]} print(common) return answer
내림차순 정렬
Lsorted(L,reverse=True)
LV2.가장큰수
숫자배열이 주어지면 문자열로 바꾼 조합으로 가장 큰 수를 찾음.
가장 큰수를 찾는거라 모든 경우의 수를 찾는 과정을 dfs라고 생각했는데 시간 초과남.
정렬하는 과정에서 사전식 문자열 비교로 정렬을 통해 순서대로 숫자를 나열하는것이 핵심포인트
def solution(numbers): numbers=list(str(x) for x in numbers) #문자열로 바꿈 #사전식으로 숫자 문자열을 비교 #[3,34,600,30]이 있을때, 문자열로 합치므로 앞자리수부터 사전식 비교가 필요. #이때 자릿수가 다르면 제대로 동작 안할 수 있음 (예. "3","30" 중에서는 3를 골라야함) -> x*3으로 "333","303030"으로 만들어서 비교 sortedArr=sorted(numbers,key=lambda x:x*3,reverse=True) answer="".join(sortedArr) if answer[0]=="0": answer="0" return answer
'코테공부' 카테고리의 다른 글
[프로그래머스] 문자열 압축 (0) 2025.02.27 [백준 16926번] 배열 돌리기 1 (0) 2025.02.27 [백준] 누적합구하기 (0) 2025.02.07 파이썬 기본 check point 정리 (0) 2024.11.22 Python 코테 기본 문법 (0) 2024.11.18