배운 내용

효율적으로 값 넣는 방법 -> 1 2 3 4 6 8 입력시

data = list(map(int, input().split()))

출처: https://thisismi.tistory.com/entry/백준-1966번-프린터-큐-파이썬-정답-코드 [This is Mi:티스토리]

덱 안에 해당 숫자가 있는지 확인하는 방법 -> 값 in 덱

덱에서 가장 앞에 있는 수 조회 -> 덱[0] / 가장 뒤에 있는 수 조회 -> 덱[-1]

 

접근 방식

  • 순서를 기록해야 하기 때문에, 순서 기록용 덱을 하나 더 생성해서 중요도를 담은 덱과 함께 추가와 제외를 함

 

 

정답

import collections

n_count = int(input())
ans = []

for _ in range(n_count):
    deque = collections.deque()
    seq = collections.deque()

    n, m = map(int, input().split())

    numbers = map(int, input().split())
    index = 0
    for i in numbers:
        deque.append(i)
        seq.append(index)
        index += 1

    count = 0
    max_value = max(deque)

    while m in seq:
        if deque[0] != max_value:
            deque.rotate(-1)
            seq.rotate(-1)
        else:
            deque.popleft()
            seq.popleft()
            count += 1
            if len(deque):
                max_value = max(deque)

    ans.append(count)

for i in ans:
    print(i)

'Algorithm' 카테고리의 다른 글

5430 AC / 큐  (0) 2025.01.18
10866 덱 / 큐  (0) 2025.01.17
이상한 문자 만들기 / 프로그래머스  (1) 2025.01.15
11866 요세푸스 문제 0 / 큐, 덱  (1) 2025.01.15
2609 최대공약수와 최소공배수 / 정수론 및 조합론  (1) 2025.01.14

이상한 문자 만들기

split() vs split(' ')의 차이

입력: "hello world"

  • split(): 공백 여러 개가 있어도 하나로 간주해서 분리
     
    s = "hello world" print(s.split()) # Output: ['hello', 'world']
  • split(' '): 공백을 기준으로 나누되, 연속된 공백을 빈 문자열로 취급
     
    s = "hello world" print(s.split(' ')) # Output: ['hello', '', 'world']

-> split(' ')을 사용하면 공백을 포함하여 입력받은 그대로 다시 출력할 수 있음

def solution(s):
    words = s.split(' ')
    answer = ""
    
    for i in range(len(words)):
        word = words[i]
        for j in range(len(word)):
            if j == 0 or j % 2 == 0:
                answer += word[j].upper()
            else:
                answer += word[j].lower()
        answer += " "
        
    return answer[0:-1]

'Algorithm' 카테고리의 다른 글

10866 덱 / 큐  (0) 2025.01.17
1966 프린터 큐 / 큐  (0) 2025.01.16
11866 요세푸스 문제 0 / 큐, 덱  (1) 2025.01.15
2609 최대공약수와 최소공배수 / 정수론 및 조합론  (1) 2025.01.14
행렬의 덧셈 / 프로그래머스  (2) 2025.01.14

 

Deque

Stack으로 사용하는 법

  • dq.append(값)
  • dq.pop()
    • 오른쪽이 일반 기준이라고 생각하면 됨

Queue로 사용하는 법

  • dq.append(값)
  • dq.popleft()

rotate()

  • rotate 값이 음수인 경우
    • 왼쪽으로 큐가 돌게 됨 -> 앞쪽에 있는 요소가 뒤로 가게 됨

 

  • rotate 값이 양수인 경우
    • 왼쪽으로 큐가 돌게 됨 -> 뒤쪽에 있는 요소가 앞으로 가게 됨

 

정답코드

import collections
n, k = map(int, input().split())

deque = collections.deque()
ans = []

for i in range(1, n+1):
    deque.append(i)

idx = 0
while 0 < len(deque):
    idx = (idx + 2) % len(deque)
    #rotate가 음수라면 앞쪽에 있는 요소가 해당 갯수만큼 뒤쪽으로 감
    deque.rotate(-(k-1))
    ans.append(deque.popleft())

print("<", end="")
for i in ans[:-1]:
    print(str(i)+", ", end="")
print(ans[-1], end="")
print(">", end="")

  • 최소공배수 -> 최대공약수 * 첫번째 수를 최대공약수로 나눈 몫 * 두번째 수를 최대공약수로 나눈 몫
  • 최대 공약수 -> 둘 중에 더 큰 범위까지의 수 중에서 두 수가 모두 나머지가 0이 되는 수
number1, number2 = map(int, (input().split()))

end = max(number1, number2)
max_number = 0
for i in range(1, end+1):
    if number1 % i == 0 and number2 % i == 0:
        max_number = i

min_number = (number1 // max_number) * (number2 // max_number) * max_number
print(max_number)
print(min_number)

행렬의 덧셈

def solution(arr1, arr2):
    answer = []
    for i in range(len(arr1)):
        row = []
        for j in range(len(arr1[i])):
            row.append(arr1[i][j] + arr2[i][j])
        answer.append(row)
    return answer

 

직사각형 별찍기

a, b = map(int, input().strip().split(' '))
for i in range(b):
    for j in range(a):
        print("*", end="")
    print()

 

최대공약수와 최소공배수

def solution(n, m):
    answer = []
    max_num = 0
    for i in range(1, m + 1):
        if n % i == 0 and m % i == 0:
            max_num = i
        

    a = n / max_num
    b = m / max_num
    
    min_num = a * b * max_num   
    answer.append(max_num)
    answer.append(min_num)
    return answer

 

3진법 뒤집기

  • n 진법 -> 해당 수를 n으로 나눈 나머지를 붙이면 됨
  • int(string, n) -> n진법의 수를 10진수로 변환
def solution(n):
    answer = 0
    three_number = ""
    while n > 0:
        three_number += str(n % 3)
        n //= 3
        
    answer = int(three_number, 3)
    return answer

부족한 금액 계산하기

class Solution {
    public long solution(int price, int money, int count) {
        long answer = 0;
        long s = 0;
        for (int i = 1; i <= count; i++){
            s += price * i;
        }
        
        if (money - s > 0){
            return 0;
        } else {
            answer = (money - s) * -1;
            return answer;
        }
    }
}

 

문자열 다루기 기본

숫자로만 이루어졌는지 확인하는 함수 : "asdfs".isdigit()

문자로만 이루어졌는지 확인하는 함수 : "234".isalpha(), Character.isDigit(s.charAt(i))

def solution(s):
    if len(s) == 4 or len(s) == 6:
        return s.isdigit()
    else:
        return False
import java.util.*;

class Solution {
    public boolean solution(String s) {
        if (s.length() != 4 && s.length() != 6){
            return false;
        }
        
        for(int i = 0; i < s.length(); i++){
            if(!Character.isDigit(s.charAt(i))){
                return false;
            }
        }
        
        return true;
    }
}

 

 

n = int(input())
members = []
sequence = 1
for _ in range(n):
    age, name = input().split()
    members.append([int(age), name, sequence])
    sequence += 1

members.sort(key = lambda m : (m[0], m[2]))

for i in members:
    print(str(i[0]) + " " + str(i[1]))

 

JAVA

  • sc.next() : 입력 스트림에서 공백을 기준으로 하나의 단어를 읽어옴
  • Arrays.sort() : 안정 정렬 특성을 가짐 -> 정렬 기준이 같은 값들에 대해 기존 순서를 유지하는 정렬 즉, 입력받은 순서대로 유지
import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
 
public class Main {
	public static void main(String[] args) {		
 
		Scanner in = new Scanner(System.in);
		
		int N = in.nextInt();
		String[][] arr = new String[N][2];
		
 
		for(int i = 0; i < N; i++) {
			arr[i][0] = in.next();	// 나이
			arr[i][1] = in.next();	// 이름
		}
 
		
		Arrays.sort(arr, new Comparator<String[]>() {
			// 나이순으로 정렬
			@Override
			public int compare(String[] s1, String[] s2) {
				return Integer.parseInt(s1[0]) - Integer.parseInt(s2[0]);
			}
			
		});
		
		for(int i = 0; i < N; i++) {
			System.out.println(arr[i][0] + " " + arr[i][1]);
		}
        
		
	}
 
}

가운데 글자 가져오기

  • String을 char배열로 : 변수명.charAt(index접근 가능);
class Solution {
    public String solution(String s) {
        String answer = "";
        if (s.length() % 2 == 0){
            answer += s.charAt(s.length() / 2 - 1);
            answer += s.charAt(s.length() / 2);
        } else {
            answer += s.charAt(s.length() / 2);
        }
        return answer;
    }
}

 

수박수박수박수박수박수?

class Solution {
    public String solution(int n) {
        String answer = "";
        for (int i = 1; i <= n; i++){
            if(i % 2 != 0){
                answer += "수";
            }else{
                answer += "박";
            }
        }
        return answer;
    }
}

 

내적

class Solution {
    public int solution(int[] a, int[] b) {
        int answer = 0;
        for(int i = 0; i < a.length; i++){
            answer = answer + a[i] * b[i];
        }
        return answer;
    }
}

 

약수의 개수와 덧셈

class Solution {
    public int solution(int left, int right) {
        int answer = 0;
        for (int  i = left; i <= right; i++){
            int count = 0;
            for(int j = 1; j <= i; j++){
                if(i % j == 0){
                    count++;
                }
            }
            if(count % 2 == 0){
                answer += i;
            }else{
                answer -= i;
            }
        }
        return answer;
    }
}

 

문자열 내림차순으로 배치하기

import java.util.*;
class Solution {
    public String solution(String s) {
        char[] sArr = s.toCharArray();
        Arrays.sort(sArr);
        StringBuilder answer = new StringBuilder();
        for (int i = sArr.length-1; i >= 0; i--){
            answer.append(sArr[i]);
        }
        return answer.toString();
    }
}

 

 

+ Recent posts