우연한 기회로 인프런에서 코딩테스트 합격자 되기 스터디원 모집 공고를 보고 신청하게 되었다.

열심히 공부해서 스터디가 끝난 후에는 코딩테스트에 자신감이 붙을 수 있도록 노력해야지..

그리고 올해 안에 이직도 성공할 수 있기를! 🍀


[알고리즘]

📝 알고리즘 : 어떠한 문제를 해결하기 위한 일련의 규칙이나 절차

다음 조건을 충족해야 한다.

- 정밀성 : 변하지 않는 명확한 작업 단계를 거쳐야 함

- 유일성 : 각 단계마다 명확한 다음 단계를 거쳐야 함

- 타당성 : 구현할 수 있고 실용적이어야 함

- 입력, 출력

- 유한성 : 일정한 시간 내에 결과를 도출해야 함 (무한루프 X)

- 일반성 : 모든 입력들에 대해 적용할 수 있어야 함 (특정한 경우에만 적용된다면 일반성을 만족시키지 않음)

 

📝 알고리즘의 성능 측정 방법

  • 연산 횟수 측정 - 코드가 동일하면 연산횟수가 모두 동일하므로 객관적 지표로 사용 가능함. 연산횟수는 환경에 영향을 받지 않으나 입력값에 따라 달라질 수 있음
    • 예시) 입력값에 따른 연산 횟수가 일정하지 않은 경우
#include <iostream>

using namespace std;

void solution(int n) {
	if(n%2 == 0) {
    	for (int i = 0; i < n*n; ++i) {
        	cout << i << endl; 
        }
    } else {
    	for (int i = 0; i <= n; ++i) {
        	cout << i <<endl;
        }
    }
}

위 코드에서 연산횟수를 구하면 N이 짝수인 경우 N^2, N이 홀수인 경우 N 이 되므로 연산횟수가 일정하지 않다.

코딩테스트에서는 최악의 경우를 기준으로 연산횟수를 정한다.

 

입력값에 따른 연산횟수를 측정해서 알고리즘의 성능을 지표로 나타내는 것을 시간복잡도 라고 한다.

 

[점근적 표기법]

  • 정확한 연산횟수가 아닌, 연산횟수의 추이를 활용해 시간복잡도 표기
  • 최악의 경우를 고려해서 점근적 표기법으로 나타내는 것을 빅오표기법이라고 한다.
    • 방법
      1. 다항식에서 가장 많이 영항을 미치는 항을 남기고 제거
      2. 마지막 남은 항의 계수를 제거

📝 예시)
3x^2 + 5x + 6  을 빅오 표기법으로 표기하면  O(x^2)
   -> 다항함수로 구성되어 있으므로 최고차항 x^2만 남음

x + logx 을 빅오 표기법으로 표기하면 O(x)
   -> 다항함수와 로그함수로 구성되어 있음. 증가폭이 더 낮은 로그함수는 사라지고 다항함수만 남음

 

[점근적 표기법의 코딩테스트 활용 방법]

  • 주어진 입력값의 크기를 통해 어느 정도 시간복잡도 까지 허용되는지 추측 가능
  • 구현 시 어떤 자료구조/알고리즘을 선택할 지 명확히 할 수 있음
  • 구현한 코드가 시간초과 발생할 것인지 미리 파악 가능

[참고 강의]

코딩테스트 합격자 되기 - C++ [ https://inf.run/t92e1 ]

https://softeer.ai/practice/7626

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

산타가 방문할 가능성이 있는 서로 다른 두 마을 조합의 수를 구하는 문제이다.

산타가 방문할 가능성이 있는 마을은 가장 거리가 가까운 두 마을이므로, 먼저 각 마을 간 최소 거리를 구한 후 모든 마을의 위치 조합을 구한다.

파이썬에서는 itertools 라이브러리를 사용해서 쉽게 조합을 얻을 수 있다.

각 마을 간 모든 조합을 구한 후, 최소 거리를 만족하는 조합만 카운트한다.

 

📝  내가 작성한 코드

import sys
from itertools import combinations

n = int(input())
towns = list(map(int, input().split()))
answer = 0

# 각 마을 간 최소 거리 구하기
dist = towns[1]-towns[0]
for idx1 in range(len(towns)-1, 0, -1):
    for idx2 in range(idx1):
        if towns[idx2+1] - towns[idx2] < dist:
            dist = towns[idx2+1]-towns[idx2]

# 모든 마을 위치 조합 구하기
towns = list(combinations(towns,2))

# 조합에서 마을간의 거리가 dist와 일치하는 경우에 answer + 1
for town in towns:
    a,b = town
    if b-a == dist:
        answer += 1

print(answer)

 

좀 더 깔끔하게 풀 수 있는 방법이 있을 것 같은데...ㅠㅠ

'개발 > 코딩테스트' 카테고리의 다른 글

[프로그래머스] 캐릭터의 좌표  (0) 2024.02.23
[Softeer] 위험한 효도  (0) 2024.02.22
[Softeer] 근무 시간  (0) 2024.02.22
[프로그래머스] 모의고사  (0) 2024.02.22
[프로그래머스] 배열 조각하기  (0) 2024.02.15

https://school.programmers.co.kr/learn/courses/30/lessons/120861

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝  내가 작성한 코드

def solution(keyinput, board):
    answer = []
    # 위 아래 왼쪽 오른쪽 이동방향
    dx = [0, 0, -1, 1]
    dy = [1, -1, 0, 0]
    move_type = ["up", "down", "left", "right"]
    # 초기 위치
    x,y = 0,0
    n,m = int(board[0]//2), int(board[1]//2)

    for i in keyinput:
        for move in range(len(move_type)):
            if i == move_type[move]:
                nx = x+dx[move]
                ny = y+dy[move]
	# board를 벗어나는 경우 무시한다 (음수인 경우도 비교해야 하기 때문에 절대값 함수 사용)
        if abs(nx) > abs(n) or abs(ny) > abs(m):
            continue
        # 좌표를 이동한다
        x,y = nx,ny
    
    return [x,y]

'개발 > 코딩테스트' 카테고리의 다른 글

[Softeer] 연탄 배달의 시작  (0) 2024.02.24
[Softeer] 위험한 효도  (0) 2024.02.22
[Softeer] 근무 시간  (0) 2024.02.22
[프로그래머스] 모의고사  (0) 2024.02.22
[프로그래머스] 배열 조각하기  (0) 2024.02.15

📝  내가 작성한 코드

import sys

def calc_cycle(a,b,d):
    time = 0
    view = 'back'
    while d > 0:
        if view == 'back':
            for i in range(a):
                d -= 1
                time += 1
                # 남우가 술래에게 닿으면 return
                if d == 0:
                    return time
            view = 'front'
        elif view == 'front':
            time += b
            view = 'back'

a,b,d = input().split()
a,b,d = int(a),int(b),int(d)

# 터치 전
times = calc_cycle(a,b,d)

# 터치 후 값 바꿔서 한번더 실행
a,b = b,a
times += calc_cycle(a,b,d)

print(times)

'개발 > 코딩테스트' 카테고리의 다른 글

[Softeer] 연탄 배달의 시작  (0) 2024.02.24
[프로그래머스] 캐릭터의 좌표  (0) 2024.02.23
[Softeer] 근무 시간  (0) 2024.02.22
[프로그래머스] 모의고사  (0) 2024.02.22
[프로그래머스] 배열 조각하기  (0) 2024.02.15

월요일부터 금요일까지 직원들의 근무 시간을 입력받아서 총 몇 분을 근무했는지 구하는 문제이다.

✅ input 값이 근무 시작시간(시간:분) , 근무 종료시간(시간:분)으로 주어진다.

근무 종료시간과 근무 시작시간의 차이를 구해서 더해주면 된다. 분 단위로 계산하기 위해서 시간 * 60 해준다.

 

📝  내가 작성한 코드

import sys

answer = 0
for i in range(5):
    stime,etime = map(str, input().split())
    s_hour,s_min = stime.split(":")
    e_hour,e_min = etime.split(":")
    
    answer += (int(e_hour)*60+int(e_min)) - (int(s_hour)*60+int(s_min))

print(answer)

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

📝  내가 작성한 코드

def solution(answers):
    answer = []
    scores = [0,0,0]
    
    # 각 수포자들이 찍는 정답 배열
    person_1 = [1, 2, 3, 4, 5]
    person_2 = [2, 1, 2, 3, 2, 4, 2, 5]
    person_3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    # answers 배열을 반복하면서 정답과 수포자의 답이 일치하는 지 체크한다
    for idx, val in enumerate(answers):
    	# 1번 수포자는 5개의 답이 반복되므로 index를 5로 나눠서 정답 배열 안에서 돌도록 한다
        if val == person_1[idx%5]:
            scores[0] += 1
        # 2번 수포자는 8개의 답이 반복되므로 index를 8로 나눠서 정답 배열 안에서 돌도록 한다
        if val == person_2[idx%8]:
            scores[1] += 1
        # 3번 수포자는 10개의 답이 반복되므로 index를 10으로 나눠서 정답 배열 안에서 돌도록 한다
        if val == person_3[idx%10]:
            scores[2] += 1

	# 점수 계산이 끝난 후 가장 높은 점수를 가진 index 리스트 리턴
    for i,score in enumerate(scores,1):
        if score == max(scores):
            answer.append(i)
    return answer

 

 

올해 1월 첫째주 부터 약 6주 간 진행했던 혼공학습단 11기가 끝났습니다. 😎

 

항상 파이썬 공부 해야지 하고 생각만 하고, 책 앞 부분만 몇 번 뒤적거리다가....

회사 다니면서 개인 공부하기 바쁘다는 핑계로 슬그머니 덮어 놓기 일쑤였는데, 이번에는 기본서 한 권을 다 볼 수 있었습니다!!

 

사실 제가 의지박약이라 초반엔 의욕이 넘쳐서 이것 저것 하다가 갈수록 늘어지고 결국 포기했던 경험이 많았어서, 내심 완주를 걱정했었는데 성공해서 너무 뿌듯하고 행복합니다 😊

 

회사 업무에, 이직 준비에 이래저래 바빴던 나날이었지만, 매주 미션을 제출하면 족장님이 장문의 정성스러운 코멘트를 달아 주십니다.

바쁘고 힘들 때는 하기 싫은 마음도 들었지만... 항상 달아주시는 따뜻한 댓글, 폭풍칭찬 덕분에 더 의욕이 샘솟고, 다음 주도 꼭 제출해야지 하는 원동력이 되었던 것 같아요. ❤️

 

또 다른 학습단 분들이 공부하신 내용도 보면서 자극 받을 수도 있었구요.

 

이번 활동을 통해서 많은 것을 얻을 수 있었습니다.

 

매 주 꾸준히 파이썬을 공부하고, 공부한 내용을 나만의 언어로 정리한 것, 그리고 정해진 기간 내에 모두 끝냈다는 것, 파이썬으로 간단한 프로그램을 작성할 수 있게 되었고 파이썬으로 코딩테스트 문제를 풀어볼 수 있게 되었다는 것. 모두 혼공학습단을 하면서 얻게 된 성과입니다.

 

그리고 활동을 시작하면서, "천재지변이 아니면 절대 지각하지 말자" 라고 다짐 했었는데, 이 부분도 지켜진 것 같아 뿌듯합니다.

 

혼공학습단 11기 활동은 여기서 끝나지만, 책 내용을 완벽하게 이해한 것은 아니기 때문에 파이썬 공부는 계속하려고 합니다. 파이썬 마스터가 되는 그 날까지! 🫡

혼공학습단 12기는 올해 6월 중순에 또 모집 한다고 합니다.

12기 모집하면.... 또 신청 할 거에요 👻

https://school.programmers.co.kr/learn/courses/30/lessons/120887

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

i 부터 j 까지의 범위에서 k가 몇 번 등장하는 지 구하는 문제이다.

✅ i~j 범위로 반복문을 돌려주고, 범위 내의 숫자에 대해서 k와 같은 값이 있는지 확인하고, 있으면 answer + 1

✅ 문자로 바꿔서 확인하면 쉽게 구할 수 있다.

 

📝  내가 작성한 코드

def solution(i, j, k):
    answer = 0
    for idx in range(i, j+1):
        for c in str(idx):
            if c == str(k):
                answer += 1
    return answer

 

+ Recent posts