백준 251

[백준, 파이썬, 1406번] 에디터

풀이 처음 접근한 방식은 그래도 최대한 계산을 덜하도록 하기 위해 인덱스와 길이를 계산하면서 조건 분기후 처리하려 했지만 역시나 시간초과가 발생하여 아래에 있던 힌트에 스택을 활용하여 해결 좌우에 각각의 배열을 만들어 해결했는데 우선 초기 문자열을 좌측 l 배열에 넣고 L문자가 주어지면 l배열의 가장 마지막 값을 r배열 가장 왼쪽에 추가하고 D는 l배열 가장 마지막 문자를 지우는 형식으로 B와 P 또한 각 조건 분기에 맞게 처리하여 마지막엔 각각의 배열을 합쳐 출력하여 해결 여기서 deque는 간단하게 배열 좌우에서 추가 제거가 가능하도록 하기 위해 사용 첫 번째 풀이가 정답 코드이며, 두 번째 풀이가 시간 초과 코드 첫 번째 풀이(정답) import sys from collections import d..

알고리즘 2024.04.23

[백준, 파이썬, 1544번] 사이클 단어

풀이 그냥 단순하게 생각해서 받아오는 입력값 중 첫 단어를 기준으로 하나씩 순회하며 첫 단어와 같은지 확인하고자 했으며 첫 단어를 2배로 늘려 좀 더 쉽게 확인했고, 해당 단어와 같다면 li 배열에 추가하여 탐색이 끝난 뒤 word 배열에서 제거하여 해결 import sys input = sys.stdin.readline word = [input().rstrip('\n') for _ in range(int(input()))] result = 0 while len(word) != 0: result += 1 a = word.pop(0) a = a+a li = [] for i in range(len(word)): i_ln = len(word[i]) if len(a)//2 == i_ln: for j in ran..

알고리즘 2024.02.15

[백준, 파이썬, 3023번] 마술사 이민혁

풀이 해당 문제에서 중요했던 점으로 생각하는 건 깊은 복사를 인지하는지 물어보는 문제 같았다. 카드 접어서 추가하는 건 check로 받아온 값을 mtx에 넣어주며 코드와 같이 슬라이싱을 활용해서 li를 만들어주고 얕은 복사를 하지 않기 위해 반복문으로 하나씩 값을 넣어주고 이후 에러 위치에는 기존 값에 따라 서로 다른 값으로 넣어주면서 해결 import sys input = sys.stdin.readline r,c = map(int,input().split()) mtx = [[""]*(2*c) for _ in range(r*2)] check = [list(input().rstrip('\n')) for _ in range(r)] err = list(map(int,input().split())) cnt = ..

알고리즘 2024.02.15

[백준, 파이썬, 1835번] 카드

풀이 역순으로 생각해야 풀 수 있는 문제라고 생각했기에 카드 배열을 reverse() 한 다음 result 라는 배열을 계속 한 칸씩 밀어낼 수 있도록 하기 위해 deque를 사용 이후 카드 배열을 하나씩 추가한 다음 cnt에 맞게 rotate를 통해 뒤에서 앞으로 한 칸씩 밀어내어 해결 from collections import deque n = int(input()) cnt = n li = [i for i in range(1,n+1)] li.reverse() result = deque([]) for i in li: result.appendleft(i) for _ in range(cnt): result.rotate(1) cnt -= 1 print(*result)

알고리즘 2024.02.14

[백준, 파이썬, 4583번] 거울상

풀이 뭔가 뭔가하게 깔끔하지 못한 풀이가 되어버린... 작성 초기엔 간단하게 작성 가능할거라고 생각했는데 숨겨진 TC를 찾다보니 더러워져버렸다. 우선 그냥 빈 문자열에 값을 추가하면서 진행하게 되면 객체를 계속 생성하는 비효율적인 문제로 result를 문자 크기에 맞게 생성 후 작업 이후 반목문을 통한 i와 back의 값이 서로 거울상 관계인지, 자신과 거울상인지 확인 후 dic에 key값으로 값을 넣어 저장 이후 문자열 길이가 홀수의 경우 따로 한 번 더 조건을 추가하여 해결 import sys input = sys.stdin.readline mirror = {"b","d","p","q","i","o","v","w","x"} dic = {"b":"d", "d":"b", "p":"q", "q":"p" }..

알고리즘 2024.02.14

[백준, 자바, 1384번] 메시지

풀이 name과 check 2차원 배열을 만들어 둔 다음 반복문을 통해 받아오는 입력 값 중 첫 값은 name, 이 후의 값을 확인하여 인덱스 값을 추가한 다음 다시 반복문을 순회하며 check에 추가된 인덱스 값에 맞게 출력문을 출력하며 state에 따른 출력문 또한 함께 출력 예시에선 N으로 된 나쁜 말을 작성하는 친구가 한 명 뿐이지만 숨어있는 입력값으로는 더 많을 것으로 예상되어 아래와 같이 코드를 작성하여 해결 import java.io.*; import java.util.*; public class 메시지 { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new In..

알고리즘 2024.02.13

[백준, 파이썬, 1384번] 메시지

풀이 name과 check 2차원 배열을 만들어 둔 다음 반복문을 통해 받아오는 입력 값 중 첫 값은 name, 이 후의 값을 확인하여 인덱스 값을 추가한 다음 다시 반복문을 순회하며 check에 추가된 인덱스 값에 맞게 출력문을 출력하며 state에 따른 출력문 또한 함께 출력 예시에선 N으로 된 나쁜 말을 작성하는 친구가 한 명 뿐이지만 숨어있는 입력값으로는 더 많을 것으로 예상되어 아래와 같이 코드를 작성하여 해결 import sys input = sys.stdin.readline tc = 1 while True: n = int(input()) if not n: break name = [""]*n check = [[0] for _ in range(n)] state = True for i in ran..

알고리즘 2024.02.13

[백준, 자바, 1380번] 귀걸이

풀이 2*n-1 줄로 주어지는 입력 값 중 첫 번째 입력값인 인덱스를 통해 cnt 배열에서 -1 하여 마지막 for문에서 cnt의 값이 1인 인덱스를 name에서 찾아 tc 와 함께 출력하여 해결 import java.io.*; import java.util.*; public class 귀걸이 { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int tc = 1; while (true) { int n = Integer.parseInt(br.readLine()); if (n == 0) break; ArrayList n..

알고리즘 2024.02.13

[백준, 파이썬, 1380번] 귀걸이

풀이 2*n-1 줄로 주어지는 입력 값 중 첫 번째 입력값인 인덱스를 통해 cnt 배열에서 -1 하여 마지막 for문에서 cnt의 값이 1인 인덱스를 name에서 찾아 tc 와 함께 출력하여 해결 import sys input = sys.stdin.readline tc = 1 while True: n = int(input()) if not n: break name = [input().rstrip('\n') for _ in range(n)] cnt = [2 for _ in range(n)] for _ in range(2*n-1): idx, check = input().rstrip('\n').split() cnt[int(idx)-1] -= 1 for i in range(n): if cnt[i] == 1: p..

알고리즘 2024.02.13