첫 번째 접근

  • 인덱스로 뽑은 키들과 원래 문자열을 딕셔너리로 만들기
  • 키를 정렬한 후 정렬된 키를 바탕으로 새로운 딕셔너리 만들기
  • 중복 키 처리가 곤란함
s = ["csdf", "bbb", "cccc"]
n = 1
dic = {}
idx = []

for i in s:
    dic[i[n]] = i
print(dic.keys())
sorted_key = sorted(dic.keys())
new_dic = {}
for i in sorted_key:
    new_dic[i] = dic[i]
print(new_dic.values())

 

정답

  • 키를 뽑은 인덱스와 원래값을 함께 담은 리스트생성
  • 인덱스 순으로 정렬하고, 인덱스가 동일하다면 원래 문자열값과 비교
def solution(strings, n):
    answer = []
    num = []
    #정렬 인덱스를 뽑은 리스트 만들기
    for i in strings:
        num.append([i[n], i])
    num.sort(key = lambda m : (m[0], m[1]))
    for i in num:
        answer.append(i[1])
    return answer

 

 

 

정답 (replace 사용 버전)

  • dictionary.items(): 딕셔너리의 키벨류 값을 동시에 가져옴
print(num_dict.items())
# dict_items([('zero', '0'), ('one', '1'), ('two', '2'), ..., ('nine', '9')])
  • s.replace(key, value) : key를 value값으로 변경해줌
def solution(s):
    dictionary = {"zero":"0", "one":"1", "two":"2", "three":"3", "four":"4", "five":"5", 
                  "six":"6", "seven":"7", "eight":"8", "nine":"9"}
    for key, value in dictionary.items():
        s = s.replace(key, value)
    return int(s)

 

정답 (replace 사용 안한 버전)

isdigit() : 문자열이 숫자인지 확인하는 함수

def solution(s):
    dictionary = {"zero":"0", "one":"1", "two":"2", "three":"3", "four":"4", "five":"5",
                  "six":"6", "seven":"7", "eight":"8", "nine":"9"}

    temp = ""
    ans = ""

    for i in s:
        if i.isdigit():
            ans += i
        else:
            temp += i
            if temp in dictionary:
                ans += dictionary[temp]
                temp = ""
    return int(ans)

 

시저 암호

 

처음 오답

def solution(s, n):
    answer = ""
    for i in s:
        if i == " ":
            answer += " "
        elif i == "z" or i == "Z":
            answer += chr(ord(i) - 26 + n)
        else:
            answer += chr(ord(i) + n)
    return answer

 

  • z만 처리해 줄 것이 아니라 나머지 문자도 범위를 초과해야 하는 경우 처리를 해 줘야 했음

 

정답

  • ord() : 아스키코드값으로 변경해줌 -> 파이썬은 c언어와 다르게 명시적으로 함수를 사용해야 함
  • chr() : 아스키코드를 문자로 변경
def solution(s, n):
    answer = ""
    for i in s:
        if i == " ":
            answer += " "
        elif i.islower():
            answer += chr((ord(i) - ord('a') + n) % 26 + ord('a'))
        elif i.isupper():
            answer += chr((ord(i) - ord('A') + n) % 26 + ord('A'))
    return answer

 

1. 먼저, 세로가 가로보다 더 크다면 명함을 돌린다 

2. 돌린 후에 가로와 세로의 최댓값을 찾는다

 

def solution(sizes):
    rotated = []
    # 가로, 세로 길이 중에서 더 긴 값을 가로로 두기 -> 돌린다
    for i in sizes:
        if i[0] < i[1]:
            i = [i[1], i[0]]
        rotated.append(i)

    # 모든 명함이 들어갈 수 있는 크기여야 하기 때문에 최댓값 추출
    max_w = max(i[0] for i in rotated)
    max_h = max(i[1] for i in rotated)

    return max_w * max_h

'Algorithm' 카테고리의 다른 글

숫자 문자열과 영단어 / 프로그래머스  (3) 2025.02.01
시저 암호 / 프로그래머스  (1) 2025.01.27
2606 바이러스 / DFS,BFS  (0) 2025.01.22
크기가 작은 부분 문자열 / 프로그래머스  (1) 2025.01.21
5430 AC / 큐  (0) 2025.01.18

 

접근 방법

  • 1. 먼저 연결 정보를 입력 받기
n = int(input())
m = int(input())
# 1. 연결 정보에 대해 입력 받기
con = []
for _ in range(m):
    a, b = map(int, input().split())
    con.append((a, b))

# con = [[1, 2], [2, 3], [3, 5] ....]

 

  • 2. 방문 여부를 확인하는 리스트 생성
visited = [False] * (n+1)

 

  • 3. 연결 정보 -> 그래프로 표현 (양방향 연결)
graph = {}
    for i in range(1, n+1):
        graph[i] = []
    # 결과 : {1: [], 2: [], 3: [], 4: [], 5: []}
    for a, b in con:
        graph[a].append(b)
        graph[b].append(a)

 

  • 4. 깊이 우선 탐색
def DFS(node):
        # 방문한 노드는 true로 표시
        visited[node] = True
        count = 1 # 방문한 노드는 감염되었기에 숫자 1증가
        for n in graph[node]:
            if not visited[n]:
                count += DFS(n) #방문한 노드의 이웃 노드가 탐색을 안한 곳이라면 그곳을 또 탐색
        return count

    result = DFS(1)
    return result -1

 

 

정답

n = int(input())
m = int(input())
# 1. 연결 정보에 대해 입력 받기
con = []
for _ in range(m):
    a, b = map(int, input().split())
    con.append((a, b))

# con = [[1, 2], [2, 3], [3, 5] ....]
def count(n, con):
    # 2. 방문 여부를 확인하는 리스트 생성
    visited = [False] * (n+1)
    graph = {}
    for i in range(1, n+1):
        graph[i] = []
    # 결과 : {1: [], 2: [], 3: [], 4: [], 5: []}
    # 3. 연결 정보 -> 그래프로 표현 (양방향 연결)
    for a, b in con:
        graph[a].append(b)
        graph[b].append(a)

    def DFS(node):
        # 방문한 노드는 true로 표시
        visited[node] = True
        count = 1 # 방문한 노드는 감염되었기에 숫자 1증가
        for n in graph[node]:
            if not visited[n]:
                count += DFS(n) #방문한 노드의 이웃 노드가 탐색을 안한 곳이라면 그곳을 또 탐색
        return count

    result = DFS(1)
    return result -1

print(count(n, con))

'Algorithm' 카테고리의 다른 글

시저 암호 / 프로그래머스  (1) 2025.01.27
최소직사각형 / 프로그래머스  (0) 2025.01.24
크기가 작은 부분 문자열 / 프로그래머스  (1) 2025.01.21
5430 AC / 큐  (0) 2025.01.18
10866 덱 / 큐  (0) 2025.01.17

삼총사

def solution(number):
    answer = 0
    for i in range(0, len(number)):
        for j in range(i+1, len(number)):
            for k in range(j+1, len(number)):
                if number[i] + number[j] + number[k] == 0:
                    answer += 1
    return answer

 

크기가 작은 부분 문자열

  • 첫 번째 시도 -> 하지만 테스트 케이스에서 시간 초과 및 빈 객체에 pop했다는 에러 뜸
  • len(deq) >= len(p) 이  조건 또한 빼먹음
import collections
def solution(t, p):
    answer = 0
    deq = collections.deque(t)
    while len(deq) >= len(p):
        d = ""
        copy = ""
        recover = []
        for _ in range(len(p)):
            d += deq.popleft()
        copy = d[:]
        if int(p) >= int(copy):
            answer += 1
        recover = list(d)

        for _ in range(2):
            deq.appendleft(recover.pop())


    return answer
  1. 크기가 작은 부크기가 작은 부분 문자
  • 두 번째 시도
    • 그냥 덱이고 뭐고 슬라이싱을 하면 되는 거였다..
    • 뭔가 괜히 어렵게 생각하는 습관이 있는 것 같다;; (아직 개념적인 걸? 잘 몰라서 그런 것 같음)
import collections

def solution(t, p):
    answer = 0
    t_len = len(t)
    p_len = len(p)
    start = 0
    end = p_len

    while t_len - p_len >= 0:
        n = int(t[start:end])
        if n <= int(p):
            answer += 1
        start += 1
        end += 1
        t_len -= 1

    return answer

'Algorithm' 카테고리의 다른 글

최소직사각형 / 프로그래머스  (0) 2025.01.24
2606 바이러스 / DFS,BFS  (0) 2025.01.22
5430 AC / 큐  (0) 2025.01.18
10866 덱 / 큐  (0) 2025.01.17
1966 프린터 큐 / 큐  (0) 2025.01.16

 

핵심

  • 덱을 R이 나올 때마다 뒤집으면 시간 초과가 뜸 -> 길이(N)만큼 걸리기 때문
  • 뒤집힌 상태인지 확인하는 변수를 만들어서 체크하면서 해결해야 함
  • 길이가 0인 리스트가 들어오면 덱을 초기화 시켜줘야 함

문자열 다루기

  • arr = input()[1:-1].split(',') : 입력받은 문자열에서 양옆제외하고 읽어온 후 ,을 기준으로 분리해서 값들을 배열로 저장
  • deq = collections.deque(arr) : 배열 통째로 덱에 추가
  • result = "[" + ",".join(map(str, deq)) + "]" , 을 사용하여 원소사이를 붙여줌
import collections
t = int(input())
ans = []

for _ in range(t):
    ac = input()
    n = int(input())
    arr = input()[1:-1].split(',')

    deq = collections.deque(arr)

    flag = 0 # 뒤집은 상태인지 아닌지 확인하는 변수, 홀수면 뒤집은 것
    err_count = False

    if n == 0: # 길이가 0이라면 빈 덱으로 초기화
        deq = []

    for i in ac:
        if i == "R":
            flag += 1

        if i == "D":
            if len(deq) == 0:
                ans.append("error")
                err_count = True
                break
            else:
                if flag % 2 == 0:
                    deq.popleft()
                else:
                    deq.pop()

    if not err_count:
        if flag % 2 == 0:
            result = "[" + ",".join(map(str, deq)) + "]"
            ans.append(result)
        else:
            deq.reverse()
            result = "[" + ",".join(map(str, deq)) + "]"
            ans.append(result)

for i in ans:
    print(i)

'Algorithm' 카테고리의 다른 글

2606 바이러스 / DFS,BFS  (0) 2025.01.22
크기가 작은 부분 문자열 / 프로그래머스  (1) 2025.01.21
10866 덱 / 큐  (0) 2025.01.17
1966 프린터 큐 / 큐  (0) 2025.01.16
이상한 문자 만들기 / 프로그래머스  (1) 2025.01.15

import collections

class Deq:

    def __init__(self):
        self.deque = collections.deque()

    def push_front(self, value):
        self.deque.appendleft(value)

    def push_back(self, value):
        self.deque.append(value)

    def pop_front(self):
        if len(self.deque) == 0:
            return -1

        return self.deque.popleft()

    def pop_back(self):
        if len(self.deque) == 0:
            return -1

        return self.deque.pop()

    def size(self):
        return len(self.deque)

    def empty(self):
        if len(self.deque) == 0:
            return 1
        else:
            return 0

    def front(self):
        if len(self.deque) == 0:
            return -1
        else:
            return self.deque[0]

    def back(self):
        if len(self.deque) == 0:
            return -1
        else:
            return self.deque[-1]

deque = Deq()
n = int(input())
q = []
for _ in range(n):
    q.append(input().split())

for i in q:
    if i[0] == "pop_front":
        print(deque.pop_front())
    if i[0] == "pop_back":
        print(deque.pop_back())
    if i[0] == "size":
        print(deque.size())
    if i[0] == "empty":
        print(deque.empty())
    if i[0] == "front":
        print(deque.front())
    if i[0] == "back":
        print(deque.back())
    if i[0] == "push_front":
        deque.push_front(int(i[1]))
    if i[0] == "push_back":
        deque.push_back(int(i[1]))

'Algorithm' 카테고리의 다른 글

크기가 작은 부분 문자열 / 프로그래머스  (1) 2025.01.21
5430 AC / 큐  (0) 2025.01.18
1966 프린터 큐 / 큐  (0) 2025.01.16
이상한 문자 만들기 / 프로그래머스  (1) 2025.01.15
11866 요세푸스 문제 0 / 큐, 덱  (1) 2025.01.15

+ Recent posts