728x90

 

안녕하세요!

 

오늘은 백준 문제 중에서 비교적 쉬운 문제로 꼽히는 **2675번 '문자열 반복'**을 풀어보겠습니다.

 

이 문제는 문자열을 주어진 횟수만큼 반복하여 출력하는 간단한 구현 문제입니다. 파이썬을 활용해 쉽게 접근할 수 있어요.

 

문제 설명

  • 각 테스트 케이스마다 주어진 문자열의 각 문자를 반복하여 새로운 문자열을 만드는 것이 목표입니다.
  • 입력으로는 몇 번 반복할 것인지와 문자열이 주어집니다.
  • 예를 들어, 3번 반복할 때 문자열이 "ABC"라면 "AAABBBCCC"가 출력되어야 합니다.

입력 형식

  1. 첫 번째 줄에는 테스트 케이스의 개수 T가 주어집니다.
  2. 각 테스트 케이스는 반복 횟수 R과 문자열 S로 구성됩니다.

출력 형식

  • 각 테스트 케이스마다 문자열 S의 각 문자를 R번 반복한 결과를 한 줄에 출력해야 합니다.

 

파이썬 코드 풀이

 

 

def repeat_string():
    t = int(input())
    for _ in range(t):
        r, s = input().split()
        r = int(r)
        result = ''.join([char * r for char in s])
        print(result)

if __name__ == "__main__":
    repeat_string()

 

코드 설명

  1. t = int(input()) : 테스트 케이스의 개수를 입력받습니다.
  2. for _ in range(t): : 입력된 테스트 케이스 수만큼 반복합니다.
  3. r, s = input().split() : 반복 횟수 r과 문자열 s를 입력받아 각각 변수에 저장합니다.
  4. r = int(r) : 반복 횟수를 정수형으로 변환합니다.
  5. result = ''.join([char * r for char in s]) : 문자열의 각 문자를 r번 반복하고 이를 join() 함수를 사용해 하나의 문자열로 결합합니다.
  6. print(result) : 최종적으로 반복된 문자열을 출력합니다.

 

감사합니다

728x90
반응형
728x90

 

문제 설명 요약

  • 듣도 못한 사람의 명단이 N개, 보도 못한 사람의 명단이 M개 주어집니다.
  • 이 두 명단에 모두 속하는 이름을 사전 순으로 출력하는 것이 목표입니다.

접근 방법

  1. 데이터 저장: 듣도 못한 사람의 명단을 Set 자료구조에 저장하여 중복 처리를 간단하게 합니다. 파이썬의 Set은 해시 구조를 활용하여 원소의 탐색이 평균 O(1)에 가능하기 때문에 효율적입니다.
  2. 교집합 연산: 보도 못한 사람의 명단도 입력받고, 이를 Set로 변환하여 두 집합 간의 교집합을 구합니다. 이 방법으로 두 명단에 중복된 이름을 쉽게 찾을 수 있습니다.
  3. 결과 정렬 및 출력: 교집합으로 구한 이름들을 정렬하여 요구사항대로 출력합니다.

코드 구현

다음은 파이썬으로 구현한 코드입니다:

 

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

# 듣도 못한 사람의 명단 입력
for _ in range(n):
    heard.add(input().strip())

# 보도 못한 사람의 명단 입력 및 교집합 계산
total = set()
for _ in range(m):
    name = input().strip()
    if name in heard:
        total.add(name)

# 결과 출력
result = sorted(total)
print(len(result))
for name in result:
    print(name)

주요 포인트

  • Set 자료구조 사용: 중복된 데이터를 효율적으로 처리하기 위해 파이썬의 Set을 사용하였습니다. 이는 듣도 못한 명단에서 보도 못한 사람을 찾을 때 매우 효과적입니다.
  • 시간 복잡도: 두 리스트의 길이를 각각 N, M이라 하면, 이 코드는 평균적으로 O(N + M)의 시간 복잡도를 가집니다. 이는 해시 테이블 기반의 Set 자료구조 덕분에 가능하며, 일반적인 리스트 탐색에 비해 훨씬 빠릅니다.

정리

이 문제는 두 집합 간의 교집합을 구하는 간단한 문제처럼 보이지만, Set을 활용한 효율적인 접근이 가능하다는 점에서 중요한 학습 포인트를 제공합니다. 특히, 해시 기반의 데이터 구조가 어떻게 효율성을 크게 향상시키는지를 직접 체험할 수 있습니다. 블로그에서는 이 문제를 통해 집합 연산의 유용성해시 구조의 효율성을 강조하는 방향으로 작성하면 좋을 것 같습니다.

이제 블로그에 이 문제를 소개할 때 어떤 추가적인 내용이나 스타일을 고려하고 싶으신가요? 예를 들어, 개인적인 경험이나 이 문제를 통해 배운 점 등을 추가하면 더 흥미로운 포스팅이 될 것 같습니다.

728x90
반응형
728x90

 

문제 소개

백준 1436번 문제는 '숌' 감독이 좋아하는 숫자인 '666'이 포함된 영화 제목을 찾는 문제입니다. 간단히 말해, '666'이 연속적으로 포함된 숫자들을 찾는 것이 목표입니다. 예를 들어, 첫 번째 영화 제목은 666, 두 번째 영화 제목은 1666, 세 번째는 2666입니다. 이렇게 '666'이 들어가는 숫자를 순서대로 나열해 찾는 과정이 필요합니다.

문제 접근 방법

이 문제를 해결하기 위해서는 숫자를 하나씩 증가시키며 '666'이 포함되는지를 확인해야 합니다. 단순히 1부터 시작해 조건에 맞는 숫자를 찾을 때까지 반복하면 해결할 수 있죠. 이 과정에서 중요한 점은 어떤 데이터 구조나 알고리즘의 사용보다는, 반복문을 어떻게 효율적으로 작성하는가에 있습니다.

제가 사용한 접근 방법은 다음과 같습니다:

  1. 숫자 증가시키기: 시작은 666부터 합니다. 숫자를 하나씩 증가시키면서 '666'이 포함되는지를 체크합니다.
  2. '666' 포함 여부 확인: 파이썬에서는 문자열의 부분 문자열을 손쉽게 확인할 수 있기 때문에, 이를 이용해 조건을 만족하는 숫자를 찾습니다.
  3. N번째로 찾기: 문제에서 주어진 N번째 제목을 찾기 위해, 조건을 만족할 때마다 카운트를 증가시키고, 원하는 값에 도달하면 출력합니다.

코드 구현

n = int(input())
count = 0
num = 666

while True:
    if '666' in str(num):
        count += 1
        if count == n:
            print(num)
            break
    num += 1

 

이 코드의 핵심은 while 루프를 사용해 모든 숫자를 순차적으로 검사하는 것입니다. if '666' in str(num) 구문을 통해 현재 숫자가 '666'을 포함하고 있는지 여부를 확인할 수 있습니다. 조건을 만족할 때마다 카운트를 증가시키고, N번째 숫자에 도달하면 결과를 출력하는 방식입니다.

문제 해결 후 느낀 점

이 문제는 알고리즘의 복잡함보다는 기본적인 반복과 조건 확인을 얼마나 정확하게 구현할 수 있는지를 테스트하는 문제입니다. 코드를 작성하면서 '단순 반복문'이 얼마나 강력한 도구인지를 다시금 느꼈습니다. 또한, 문자열 조작이 문제 해결에 얼마나 유용한지를 깨닫게 되었죠.

728x90
반응형
728x90

영어 회화를 잘하고 싶다면 무엇보다 중요한 것은 지속적인 연습과 실생활에서 영어를 자연스럽게 사용하는 경험입니다.

오늘은 영어 회화를 향상시키기 위해 효과적인 방법들을 소개하고, 제가 경험한 이야기들도 나누어 볼게요.

이 방법들이 여러분의 영어 회화 실력을 키우는 데 도움이 되길 바랍니다.

 

 

1. 자주 듣고 따라 말하기

영어 회화를 잘하기 위해서는 듣기와 말하기가 동시에 중요합니다.

우선 영어 대화를 자주 듣는 것부터 시작하세요.

유튜브나 넷플릭스에서 자막을 켜고 다양한 상황에서 쓰이는 표현들을 들어보세요.

요한 것은 듣는 데서 끝나는 것이 아니라, 자신이 들은 문장을 따라 말해보는 것입니다.

저는 처음에는 단어 하나하나가 어색했지만, 매일 10분씩 듣고 따라 하다 보니 발음이 점점 자연스러워졌습니다.

낯선 표현도 익숙하게 만들려면 반복이 중요합니다.


2. 언어 교환 파트너 찾기

언어 교환 파트너를 찾는 것은 실전 회화 연습에 큰 도움이 됩니다.

언어 교환 앱이나 커뮤니티를 통해 원어민 친구를 만들면, 서로의 언어를 배우며 자연스럽게 회화를 연습할 수 있습니다. 저도 몇 년 전 언어 교환 파트너를 만나 일주일에 한 번씩 영어로 대화를 나누면서 실력이 많이 늘었습니다.

긴장을 풀고 서로의 언어를 배우는 즐거움을 찾으면 자연스럽게 영어 실력이 향상됩니다.


3. 일상 생활 속에서 영어 사용하기

매일 일상 생활에서 영어를 사용할 기회를 만들어 보세요.

예를 들어, 간단한 일기나 생각을 영어로 적는 습관을 들이는 것입니다.

한 줄이라도 괜찮습니다.

매일 자신에게 일어난 일을 영어로 기록하면, 자신이 자주 사용하는 표현과 문장을 익힐 수 있게 됩니다.

저는 아침에 일어나서 날씨를 묘사하는 것부터 시작해 하루 일과를 정리하는 습관을 들였습니다.

작은 실천이지만, 꾸준히 하다 보면 영어로 생각하는 시간이 점점 늘어납니다.


4. 실수를 두려워하지 않기

영어 회화를 잘하려면 실수를 두려워하지 않는 것이 가장 중요합니다.

처음에는 틀린 문장을 말하거나 어색한 발음을 하는 것이 당연합니다.

하지만 그 실수를 통해 배우고 교정해 나가는 것이 성장의 과정입니다.

저는 언어 교환 파트너와 대화하면서 자주 실수를 했지만,

그때마다 파트너가 친절하게 교정해 주었고,

그 경험을 통해 같은 실수를 반복하지 않게 되었습니다.

실수는 배움의 기회라는 생각으로 편안하게 접근해 보세요.


5. 흥미 있는 주제로 대화하기

자신이 흥미를 느끼는 주제로 영어 대화를 나누는 것도 중요한 방법입니다.

좋아하는 영화나 음악, 스포츠에 대해 이야기하면 자연스럽게 흥미를 유지할 수 있습니다.

저도 처음 영어 회화를 시작했을 때, 제가 좋아하는 영화에 대해 이야기하는 것을 즐겼습니다.

그 덕분에 관련된 표현들을 배우는 것이 즐거웠고, 회화 연습도 훨씬 수월해졌습니다.

 

영어 회화는 하루아침에 늘지 않지만,

꾸준히 연습하고 일상 속에서 영어를 자연스럽게 사용하는 습관을 들이면 분명히 발전할 수 있습니다.

 

위에서 소개한 방법들을 실천해보면서, 자신의 속도에 맞게 즐기며 배워보세요.

영어를 공부가 아닌 새로운 사람들과 소통하고 문화를 배우는 즐거운 과정으로 생각하면 더 많은 것을 얻을 수 있을 것입니다.

 

 

728x90
반응형
728x90

 


1

문제 분석과 접근 방법

문제를 처음 읽었을 때, 8x8 크기의 체스판을 만들기 위해 여러 위치에서 시작하여 체스판을 다시 칠해야 한다는 점에서 복잡해 보였습니다. 문제의 핵심은 큰 체스판에서 8x8의 부분 체스판을 잘라내고, 그 부분이 흑백 패턴을 유지하도록 칠해야 한다는 것이었습니다. 이를 위해 여러 가지 경우를 고려해 보아야 했습니다.

접근 방법을 정리해 보았습니다:

  1. 전체 체스판에서 8x8의 부분 체스판을 모두 탐색합니다
  2. 체스판의 크기는 N x M이기 때문에 (N-7) x (M-7)의 위치에서 8x8 체스판을 시작할 수 있습니다. 각 위치에서 8x8의 부분 체스판을 슬라이딩 윈도우처럼 잘라내어 검토합니다
  3. 각 8x8 체스판에 대해 두 가지 경우의 수를 확인합니다
  4. 체스판의 첫 번째 칸이 흰색인 경우와 검은색인 경우를 각각 고려해야 합니다. 따라서 두 개의 체스판 패턴 (WBWB... 혹은 BWBW...)을 모두 비교하여 최소로 칠해야 할 칸의 개수를 계산합니다
  5. 모든 경우의 수에서 최소값을 찾습니다
  6. 각 8x8 체스판마다 두 가지 패턴을 비교한 뒤, 그 중에서 최소로 칠해야 하는 칸의 수를 기록하고, 전체 탐색이 끝난 후 가장 작은 값을 찾습니다

이 문제를 풀기 위해서는 전체 체스판을 순회하며 작은 체스판을 하나하나 검사하는, 일종의 브루트 포스 방식이 필요했습니다. 브루트 포스가 효율적인 이유는 문제에서 제공하는 N과 M의 크기가 비교적 작아 모든 경우의 수를 시도해도 시간 내에 해결이 가능하기 때문입니다.


2

구현 시 생각해본 점들

문제를 구현하면서 몇 가지 고려해야 할 점들이 있었습니다

  1. 체스판의 규칙성 유지 체스판은 규칙적으로 흑과 백이 교차하는 형태를 가져야 하기 때문에, 이 규칙을 그대로 적용하여 비교를 간단히 만들 수 있었습니다. 이를 위해 두 가지 가능한 체스판의 초기 상태를 문자열 배열로 미리 준비해 두었고, 각 부분 체스판을 탐색할 때마다 미리 준비된 패턴과 비교하는 방식으로 접근했습니다
  2. 브루트 포스의 타당성 처음에는 브루트 포스 방식으로 모든 8x8 부분 체스판을 검사하는 것이 비효율적일까 걱정했지만, 문제의 제한 조건이 크지 않기 때문에 모든 경우를 탐색해도 충분히 시간 내에 풀 수 있다는 점을 깨달았습니다. 때로는 효율성보다 명료한 풀이가 더 중요한 경우가 있음을 다시 느꼈습니다
  3. 최소 변경 횟수 계산 각 부분 체스판에서 변경해야 하는 칸의 수를 계산할 때, 첫 번째 칸의 색상에 따라 두 가지 경우를 나눠 각각 계산했습니다. 이를 통해 두 가지 패턴을 모두 고려하여 더 적은 변경 횟수를 선택할 수 있었습니다. 이 과정에서 코드의 가독성을 위해 함수를 나눠서 작성한 것이 도움이 되었습니다

3

 

코드 구현

N, M = map(int, input().split())
board = [input() for _ in range(N)]

# 체스판 패턴 미리 정의
pattern1 = ["WBWBWBWB", "BWBWBWBW"] * 4
pattern2 = ["BWBWBWBW", "WBWBWBWB"] * 4

def count_paint(x, y, pattern):
    count = 0
    for i in range(8):
        for j in range(8):
            if board[x + i][y + j] != pattern[i][j]:
                count += 1
    return count

min_paint = float('inf')

# 8x8 체스판 탐색
for i in range(N - 7):
    for j in range(M - 7):
        paint1 = count_paint(i, j, pattern1)
        paint2 = count_paint(i, j, pattern2)
        min_paint = min(min_paint, paint1, paint2)

print(min_paint)

4

문제 해결 후 느낀 점

이 문제를 해결하면서 작은 부분 문제로 나누어 전체 문제를 해결하는 방법의 중요성을 다시금 느꼈습니다. 8x8 크기의 체스판을 반복해서 검사해야 하기 때문에 반복문을 어떻게 구조화할지, 그리고 각 부분 체스판에서 색상 변경을 어떻게 계산할지에 대한 논리적인 접근이 필요했습니다. 또한, 복잡한 문제도 단계별로 접근해 나가면 충분히 풀 수 있다는 자신감을 가지게 되었습니다.

이 문제는 특히 브루트 포스의 중요성을 다시 한 번 되새길 수 있는 좋은 기회였어요. 때로는 가장 단순한 방식이 가장 효과적인 해결책이 될 수 있음을 기억하게 되었습니다. 또한, 체스판처럼 시각적이고 규칙적인 패턴을 가진 문제를 다룰 때에는 시각적으로 그려보거나, 패턴을 코드로 표현하는 연습이 큰 도움이 되겠다는 생각도 들었습니다.

문제를 해결하면서 생긴 작은 시행착오들이 앞으로의 문제 해결에 좋은 밑거름이 되기를 기대합니다. 앞으로도 이러한 경험을 바탕으로 더 많은 문제들을 해결해 나가고 싶습니다.

 

728x90
반응형
728x90

 

 

리스트 컴프리헨션(List Comprehension)

 

리스트 컴프리헨션이란 마치 요리를 할 때 필요한 재료를 한 번에 담을 수 있는 멋진 바구니와 같습니다.

 

Python에서 리스트를 보다 간결하고 효율적으로 만들 수 있는 아주 유용한 방법입니다.

 

기존에 for 루프를 사용해 리스트를 생성하는 것보다 훨씬 읽기 쉽고, 코드도 깔끔하게 작성할 수 있어요.

 

예를 들어 보겠습니다.

 


기존에는 이렇게 작성했다면

numbers = []
for x in range(10):
    numbers.append(x * 2)
print(numbers)

 

여기서 numbers 리스트에는 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]이 들어갑니다.

 

꽤 많은 줄의 코드죠?

 

그런데 리스트 컴프리헨션을 사용하면 이렇게 단순해집니다

numbers = [x * 2 for x in range(10)]
print(numbers)

 

훨씬 간단하게 끝나죠?

 

이런 식으로 리스트 컴프리헨션은 복잡한 작업도 간단하게 바꿔줍니다.

 

이걸 사용하면 코드가 훨씬 명료하고 보기 좋답니다.

 

조건이 포함된 리스트 컴프리헨션 리스트 컴프리헨션은 단순히 리스트를 만드는 것에 그치지 않아요.

 

특정 조건을 추가할 수도 있어요.

 

예를 들어, 0부터 9까지의 숫자 중에서 짝수에만 2를 곱한 리스트를 만들어 보겠습니다.


기존 방식

even_numbers = []
for x in range(10):
    if x % 2 == 0:
        even_numbers.append(x * 2)
print(even_numbers)

 

하지만 리스트 컴프리헨션을 사용하면 이렇게 간단해집니다

pairs = [(x, y) for x in [1, 2, 3] for y in [4, 5, 6]]
print(pairs)

 

중첩 루프도 한 줄로 깔끔하게 처리할 수 있습니다.

 

리스트 컴프리헨션은 이처럼 복잡한 로직도 간단하게 만들어 줍니다.

 

리스트 컴프리헨션을 연습하다 보면

 

복잡한 코드도 손쉽게 간결하게 만들 수 있습니다.

 

감사합니다.

 

 

 

 

 

 

 

 

728x90
반응형
728x90

 

1

 

문제 설명

입력으로 주어진 코드의 시간 복잡도를 판별하고, 코드의 수행 횟수와 최고차항의 차수를 출력하는 문제이다.


입력

입력은 두 줄로 이루어져 있습니다.
첫 번째 줄에 주어지는 정수 n (1 ≤ n ≤ 500,000)
두 번째 줄에 주어진 정수 f(n)



출력

두 줄에 걸쳐 답을 출력합니다.
첫 번째 줄에는 알고리즘의 수행 횟수를 출력합니다.
두 번째 줄에는 알고리즘의 시간 복잡도의 최고차항의 차수를 출력합니다.


풀이

문제는 주어진 f(n)이 **시간 복잡도가 O(1)**임을 설명합니다. 따라서 입력 값 n과는 무관하게, 알고리즘의 수행 횟수는 항상 1입니다. 최고차항의 차수 역시 0입니다.

 

맨 처음에는 알고리즘 문제 중 가장 쉬운 문제인 것 같아 진짜 가볍게 생각했다.

 

n = int(input())
m = int(input())

print(1)
print(0)

 

 

처음 입력 받고 최고 차항까지 받아야 하는 줄 알았다.

그러나 제출하고 나니 바로 런타임 에러

잠시 고민을 했다가 

 

n = input()

print(1)
print(0)

 

고정 값인 것 같길래 최고차항을 받아올 필요는 없다고 생각했다.

 


핵심 논리

입력된 n 값이 알고리즘 수행 횟수에 영향을 주지 않으므로, 알고리즘의 수행 횟수는 언제나 1입니다.
시간 복잡도가 O(1)이므로 차수는 0입니다.

 

728x90
반응형
728x90

 

백준 2869번: 달팽이는 올라가고 싶다


문제 설명
달팽이가 낮에는 올라가고, 밤에는 미끄러지며 나무 꼭대기에 도달하는 데 걸리는 일수를 계산하는 문제입니다.


문제 조건

  • 낮에는 A만큼 올라가고, 밤에는 B만큼 미끄러집니다.
  • 나무의 높이는 V입니다.
  • 마지막 날에는 꼭대기에 도달하면 미끄러지지 않습니다.

 

핵심 포인트

  1. 수식 활용:
    • 반복문 없이 간단히 계산식으로 해결 가능.
  2. 올림 연산:
    • 나눗셈 결과를 올림하여 최소 일수를 정확히 계산.

 

결과 코드

import math

a, b, v = map(int, input().split())

# a, b, v = 2, 1, 5

result = (v - b) / (a - b)

result = math.ceil(result)

print(result)

 

 

 

728x90
반응형

+ Recent posts

728x90
반응형
728x90
반응형