반응형

 

문제 설명

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

  1. 124 나라에는 자연수만 존재합니다.
  2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법       124 나라      10진법       124 나라

1 1 6 14
2 2 7 21
3 4 8 22
4 11 9 24
5 12 10 41

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

제한사항

  • n은 500,000,000이하의 자연수 입니다.

입출력 예

n              result

1 1
2 2
3 4
4 11

 

 

 

프로그래머스 LEVEL 2 문제 중에 10진수, 2진수 등

N진수에 관한 문제이다.

문제는 1,2,4 만으로 존재하는 3진수라고 생각하면 된다.

 

 

문제는 푸는 핵심은,

3으로 나눠서 0이 되는 부분에서는 몫의 -1을 취해주는 것이다.

 

정답 코드

def solution(n):
    answer = ''
    
    arr = [4,1,2]
    
    arr_str = ""
    i = 1
    
    while n:
        arr_str = str(arr[n%3]) + arr_str
        n = n//3 - (n%3 == 0)
           
    
        
    return arr_str

 

 

코딩테스트 대비 Python 강의

www.youtube.com/channel/UCYYao-BSPaetw7N2GFFJ-Yw?view_as=subscriber

 

Henry Joo

 

www.youtube.com

 

반응형
반응형

하반기 취업이 시작되었다.

 

삼성, KT, CJ, 현대, 네이버 ,카카오 등

 

다양한 기업들이 슬슬 채용 공고를 내고 있다.

 

오늘은 교회에서 혼자 기도를 하며

 

스스로에게 물어보았다.

"내가 잘 할 수 있을까..?"

 

그래도 지금까지 잘 해온 것처럼 

취업준비생으로서 놓치지 말아야하는 것은 "감사하는 마음" 인것 같다.

 

지금까지 함께하신 하나님께서 앞으로도 함께 하시고,

나의 선한 목자되신다.

 

 

형광펜 칠한 것은 지원한 곳

 

 

 

이렇게 구글닥스에 정리하면서 준비하고 있다.

동시에 코딩테스트를 준비하고 있는데,

오늘은 지난 네이버 코딩테스트를 준비하며 제출한 부분에서

조금 애매했던 것인지, 한번 더 코테를 보라고 메일이 왔다.

 

 

이런 경우는 처음이여서 

내가 푼 코드가 딱 절반을 맞췄나보다 생각했다

 

재응시 답변을 드리고 나서, 바로 메일이 왔다.

 

 

이것도 조금 더 공부하고 지금까지 풀었던 것만 잘 복습한 후에

응시해야겠다.

 

 

 

지금 진행중인 것을 정리해보면

LG U+ 코딩테스트 대기

서울시설공단 필기 준비

카카오, 라인 코테 준비,

신한카드 코테 준비

 

 

 

나를 여기까지 인도하신 하나님을 찬양하고,

앞으로도 내 인생이 하나님의 선하신 손길 아래에 있을 것을 신뢰한다

 

 

 

- 취업의 시작점에서 짧은 글 -

반응형
반응형

 

Python에서 특정 원소를 제거하는 방법은 크게 2가지이다.

 

1. 특정 원소의 인덱스를 찾아서 제거

이 방법은 특정 원소의 인덱스 정보가 필요한 경우에 사용한다.

# List의 내장함수인 index 활용

A = [1,2,3,4,5]

idx = A.index(1) # 결과값으로 0을 반환한다.

del A[idx] # 0번째 자리 수인 1을 제거한다.

 

2. 특정 원소를 바로 제거

이 방법은 특정 원소의 인덱스를 굳이 알 필요가 없는 경우, 그냥 원소를 제거할 때 사용한다.

# List의 내장함수인 remove 활용

A = [1,2,3,4,5]

A.remove(1) # 1값이 지워진다.

print(A) # [2,3,4,5] 가 출력된다. 하나씩 앞으로 당겨진다.

 

다음의 두 가지 방법으로 코딩테스트 시에 유용하게 사용할 수 있다.

 

코딩테스트 대비 Python 문제풀이 강의

www.youtube.com/channel/UCYYao-BSPaetw7N2GFFJ-Yw?view_as=subscriber

 

Henry Joo

 

www.youtube.com

 

반응형
반응형

 

 

문제 설명

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

입출력 예

nlostreservereturn

5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2

입출력 예 설명

예제 #1
1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.

예제 #2
3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.

출처

※ 공지 - 2019년 2월 18일 지문이 리뉴얼되었습니다.
※ 공지 - 2019년 2월 27일, 28일 테스트케이스가 추가되었습니다.

 

 

========================================================================================

 

해당 문제는 탐욕법 알고리즘을 사용하여 푸는 문제이다.

프로그래머스 LEVEL 1 수준의 문제이다.

 

 

탐욕법 알고리즘은 당시 상황에서 가장 최적이라고 생각되는 경우를 선택하는 알고리즘이다.

그렇기 때문에 (당시 상황이 아닌) 마지막 결과가 항상 최적의 해를 갖고 있지는 않다.

 

문제를 예를 들어 설명하면,

for문을 한번씩 돌면서 번호가 작은 순서로 탐색을 하게 되는데,

번호가 작은 (잃어버린) 학생에게 여벌 체육복을 선지급해준다.(일단 잃어버렸으니까 뒤에 사람 생각하지 않고 그냥 빌려주는 개념이다.)

 

이렇게 풀면 뒤에 사람이 필요한데 못받는 경우가 있을 수도 있지만,

 

이 문제에서는 가중치 값이 없고 그냥 몇명이 체육활동을 할 수 있는지만 확인하면 되기 때문에

앞 사람이 받든지, 뒷 사람이 받든지 결과값을 항상 동일하다.

 

def solution(n, lost, reserve):
    answer = n - len(lost)
    
    for i in lost:
        # 여벌옷 가져온 학생이 도난당했다면
        if i in reserve:
            answer += 1
            reserve.remove(i)
            continue
        
        # 앞 친구에게 먼저 빌리기
        if i-1 in reserve:
            answer += 1
            reserve.remove(i-1)
            continue
            
            
        # 도난당하지 '않은' 뒤 친구에게 빌리기
        if i+1 in reserve and i+1 not in lost:
            answer += 1
            reserve.remove(i+1)
            
    
    return answer

 

 

 

코딩테스트 대비 Python 동영상 강의

www.youtube.com/channel/UCYYao-BSPaetw7N2GFFJ-Yw?view_as=subscriber

 

Henry Joo

 

www.youtube.com

 

 

Java로도 풀어보았다.

그런데 자바는 Python 처럼 자유자재로 자료값들을 가져다가 사용할 수 없어서 조금 불편했다.

이 불편함에 익숙해지자!

 

정답 코드:

import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {
        int answer = 0;
        int[] clothes = new int[n+2];
        for(int i=0; i<n+2; i++){
            clothes[i] = 1;
        }
        for(int i=0; i<lost.length; i++){
            clothes[lost[i]] -= 1;
        }
        for(int i=0; i<reserve.length; i++){
            clothes[reserve[i]] += 1;
        }
        
        for(int i=1; i<n+1; i++){
            if(clothes[i] == 1){
                answer += 1;
            }else if(clothes[i] == 2){
                if(clothes[i-1] == 0){
                    clothes[i-1] = 1;
                    clothes[i] = 1;
                    answer += 2;
                }else if(clothes[i+1] == 0){
                    clothes[i+1] = 1;
                    clothes[i] = 1;
                    answer += 1;
                }else{
                    clothes[i] = 1;
                    answer += 1;
                }
            }else{
                continue;
            }
        }
        
        System.out.println(Arrays.toString(clothes));
        return answer;
    }
}
반응형
반응형

 

이번주 토요일에 있는 LG U+ 코딩테스트 준비를 위해 SQL 문제를 풀어보았다.

 

사실 기본적인 SQL은 조금만 공부하면 그렇게 어렵지는 않다.

대신 프로그래머로서 서버와 DB를 연결해본 경험이라든지,

DB 테이블을 직접 설계하고 구축해본 경험이라든지 이런 부분이 중요하다.

 

일단 3일에 걸쳐서 조금씩 심심풀이 문제를 풀어보았다.

아래에 있는 문제들은 프로그래머스(programmers.co.kr/learn/challenges?selected_part_id=17047) 사이트에 있는 SQL 관련한 기본예제들이다.

 

프로그래머스에 있는 SQL 문제들을 풀고 느낀 점

 

알고리즘에 비해 막히거나 어려운 문제는 거의 없다.

SQL 입문자가 연습하기 좋은 환경이라고 생각한다.

 

 

(모든 레코드 조회하기) 1번 문제는 ANIMAL_INS 테이블의 모든 정보를 순차적으로 출력하는 문제이다.

! 역순으로 출력 이란 의미는 내림차순을 의미한다. ORDER BY ANIMAL_ID DESC 에서 DESC 명령어를 통해 적용 가능.

 

정답

-- 코드를 입력하세요
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

 

(역순 정렬하기) 2번 문제는 ANIMAL_INS 테이블 정보 중 일부만 출력하는 문제이다. 마찬가지로 ORDER BY 를 사용하였다.

 

정답

-- 코드를 입력하세요
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC

 

(아픈 동물 찾기) 3번 문제는 ANIMAL_INS 테이블 정보 중 특정 조건을 만족하는 정보만 출력하는 문제이다. WHERE 절을 사용한다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "Sick"

 

(어린 동물 찾기) 4번 문제는 ANIMAL_INS 테이블 정보 중 3번과 동일하게 특정 조건을 만족하는 정보만 출력하는 문제이다.

<> 명령어를 사용하였다. <=> 같지않다(!=) 의미

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION <> "Aged"

 

(동물의 아이디와 이름) 5번 문제는 일부 정보만 조회하는 문제이다. ORDER BY 를 사용하였다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

(여러 기준으로 정렬하기) 6번 문제는 일부 정보만 조회하되, ORDER BY를 여러 Coloumn에 적용하는 문제이다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC

 

(상위 n개 레코드) 7번 문제는 LIMIT 를 사용하여 TOP N 을 출력하는 문제이다.

 

정답

-- 코드를 입력하세요
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1

 

(최댓값 구하기) 8번 문제는 가장 최근에 들어온 동물의 정보를 조회하는 문제이다.

LIMIT 혹은 MAX를 사용하여 풀 수 있다.

 

정답

-- 코드를 입력하세요
SELECT MAX(DATETIME)
FROM ANIMAL_INS
ORDER BY DATETIME

or


-- 코드를 입력하세요
SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1

 

(최솟값 구하기) 9번 문제는 가장 빨리 들어온 동물의 정보이므로 8번과 반대되는 문제이다.

LIMIT 혹은 MIN을 사용하여 풀 수 있다.

 

정답

-- 코드를 입력하세요
SELECT MIN(DATETIME)
FROM ANIMAL_INS

 

(동물 수 구하기) 10번 문제는 ANIMAL_INS 테이블에 있는 모든 row들의 갯수를 세는 문제이다.

COUNT 함수를 사용하면 된다.

 

정답

-- 코드를 입력하세요
SELECT count(*)
FROM ANIMAL_INS

 

(중복 제거하기) 11번 문제는 ANIMAL_INS 테이블의 동물 이름을 중복, NULL 값 제외하여 갯수를 세는 문제이다.

NULL에 대한 조건을 걸어줄 때는 = 연산자가 아니라 IS NOT NULL / IS NULL 이렇게 걸어준다.

 

정답

-- 코드를 입력하세요
SELECT COUNT(DISTINCT(NAME))
FROM ANIMAL_INS
WHERE NAME IS NOT NULL

 

(고양이와 개는 몇 마리 있을까) 12번 문제는 ANIMAL_INS 테이블에서 개와 고양이의 갯수를 세는 문제이다.

IN 연산자는 해당 리스트에 속해있는지 아닌지를 묻는 경우 사용한다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_TYPE, count(*)
FROM ANIMAL_INS
WHERE ANIMAL_TYPE IN ('Cat','Dog')
GROUP BY ANIMAL_TYPE

 

(동명 동물 수 찾기) 13번 문제는 ANIMAL_INS 테이블에서 GROUP BY 절을 활용하여 공통된 이름의 개수를 세는 문제이다.

서브쿼리를 사용하여 문제를 해결한다.

AS 명령어를 통해 별칭을 주어 사용한다.

 

정답

-- 코드를 입력하세요
SELECT NAME, CNT as COUNT
FROM(SELECT NAME, COUNT(*) AS CNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME) A
WHERE CNT >= 2
ORDER BY NAME

 

(입양 시각 구하기 1) 14번 문제는 ANIMAL_OUTS에서 CASE WHEN 문을 통해 조건을 주고 정보를 출력해주는 문제이다.

(CASE WHEN 조건 1 THEN 조건 1 결과 WHEN 조건 2 THEN 조건 2 결과 ELSE 그 외 결과 END)

 

정답

-- 코드를 입력하세요
SELECT (CASE WHEN SUBSTR(DATETIME,12,2) < 10 THEN SUBSTR(DATETIME,13,1) ELSE SUBSTR(DATETIME,12,2) END) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
WHERE SUBSTR(DATETIME,12,2) > 8 AND SUBSTR(DATETIME,12,2) < 20
GROUP BY SUBSTR(DATETIME,12,2)
ORDER BY SUBSTR(DATETIME,12,2)

 

(입양 시각 구하기 2) 15번 문제는 ANIMAL_OUTS에 있지 않은 시간 데이터를 임의로 만들어서 OUTER JOIN 해주어야 하는 문제이다.

set @a := -1  <=> a에 -1을 대입한다.

SELECT @a:=@a+1 자기 자신에 1을 더해주면 24 가 도달할 때까지 반복한다.

두 테이블을 OUTER JOIN 해준다.

 

정답

-- 코드를 입력하세요
set @a := -1;
SELECT HOUR, IFNULL(COUNT,0)
FROM(SELECT HOUR(DATETIME) AS HOUR1, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)) real_table RIGHT JOIN (SELECT *
FROM (SELECT @a:=@a+1 as HOUR FROM ANIMAL_OUTS) A
WHERE A.HOUR >= 0 AND A.HOUR < 24) total_table ON real_table.HOUR1 = total_table.HOUR

 

(이름이 없는 동물의 아이디) 16번 문제는 ANIMAL_INS에서 이름이 없는 정보를 조회하는 WHERE 절을 사용하는 간단한 쿼리이다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL

 

 

(이름이 있는 동물의 아이디) 17번 문제는 ANIMAL_INS에서 이름이 있는 정보를 조회하는 WHERE 절을 사용하는 간단한 쿼리이다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID

 

(Null 처리하기) 18번 문제는 ANIMAL_INS에서 이름이 없는 경우 No name이라고 출력해주는 Null 처리에 관한 문제이다.

IFNULL을 사용한다.

IFNULL(컬럼1,컬럼1이 NULL 값이면 보내줄 값)

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_TYPE, IFNULL(NAME,'No name'), SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

 

(없어진 기록 찾기) 19번 문제는 ANIMAL_OUTS에는 있는데 ANIMAL_INS에는 없는 정보를 서브쿼리를 사용하여 푸는 문제이다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
ORDER BY ANIMAL_ID

 

(있었는데요 없었습니다) 20번 문제는 ANIMAL_OUTS와 ANIMAL_INS 두 테이블에서 모두 조회를 해야하는 문제이다.

FROM 절에 2개의 테이블이 들어간다.

 

정답

-- 코드를 입력하세요
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_OUTS OUTS, ANIMAL_INS INS 
WHERE OUTS.ANIMAL_ID = INS.ANIMAL_ID AND OUTS.DATETIME < INS.DATETIME
ORDER BY INS.DATETIME

 

(오랜 기간 보호한 동물 1) 21번 문제는 ANIMAL_INS에 있는 정보 중, ANIMAL_OUTS에는 없는 정보를 추출하는 문제이다.

사용한 명령어: LIMIT, 서브쿼리

 

정답

-- 코드를 입력하세요
SELECT NAME, DATETIME
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_OUTS)
ORDER BY DATETIME
LIMIT 3

 

(보호소에서 중성화한 동물) 22번 문제는 LIKE 명령어를 사용하는 문제이다.

OUTS.SEX_UPON_OUTCOME LIKE '%blabla%'  
의 의미는 해당 OUTS.SEX_UPON_OUTCOME이 blabla라는 글자를 가지고 있는지를 물어보는 조건이다.

 

정답

-- 코드를 입력하세요
SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
FROM ANIMAL_INS INS, ANIMAL_OUTS OUTS
WHERE INS.ANIMAL_ID = OUTS.ANIMAL_ID AND (INS.SEX_UPON_INTAKE LIKE '%Intact%' AND (OUTS.SEX_UPON_OUTCOME LIKE '%Spayed%' OR OUTS.SEX_UPON_OUTCOME LIKE '%Neutered%'))
ORDER BY INS.ANIMAL_ID

 

(루시와 엘라 찾기) 23번 문제는 IN 조건식을 사용하는 문제이다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty')
ORDER BY ANIMAL_ID

 

(이름에 el이 들어가는 동물 찾기) 24번 문제는 LIKE를 사용하여 문자열 포함여부를 확인하는 문제이다

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' AND NAME LIKE '%el%'
ORDER BY NAME

 

(중성화 여부 파악하기) 25번 문제는 SELECT 절에 CASE WHEN 문을 사용해서 조건식에 따른 정보를 추출해주는 문제입니다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, CASE WHEN (SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%') THEN 'O' ELSE 'X' END AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

(오랜 기간 보호한 동물 2) 26번 문제는 FROM 절에 2개의 테이블을 가져와서 각 테이블의 데이터를 찾아서 푸는 문제이다.

LIMIT 사용

 

정답

-- 코드를 입력하세요
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_OUTS OUTS, ANIMAL_INS INS
WHERE INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY INS.DATETIME - OUTS.DATETIME
LIMIT 2

 

(DATETIME에서 DATE로 형 변환) 27번 문제는 DATETIME 자료형을 DATE라는 함수를 통해 날짜만 가져와서 푸는 문제이다.

DATETIME 관련 함수로는 HOUR, DAY, MINUTE, DATE 등이 있다.

 

정답

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, SUBSTR(DATE(DATETIME),1,10) AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

 

곧 시간을 내서 DB를 직접 설계하고 운영하는 프로젝트도 해봐야겠다.

특히 내가 가고자 하는 직군이 빅데이터 엔지니어 직군인데,

요즘에 빅데이터 엔지니어 채용 직무에 NoSQL을 사용 경험이 많이 보여서 한번 직접 해봐야겠다.

 

코로나로 인해 다들 취업이 어렵고 힘드실텐데 힘내셨으면 좋겠다.

반응형
반응형

 

완전탐색이란 

모든 경우의 수를 다 찾아보는 해결 방법이다.

 

가령 자물쇠의 비밀번호를 찾는 문제가 나온다고 할 때,

가장 쉬운 방법은 0000 부터 9999까지 한번씩 다 해보면 그 중간에 정답을 찾을 수 있는 방법입니다.

 

구현하기 쉽지만 코딩테스트에서는 오랜 시간이 걸리게 되어 Timeout을 일으킬 수도 있는 방법론입니다.ㅜㅜ

그래도 중간중간 로직을 손봐주면 확실히 무작정 코드를 짜는 것보다는 정확도와 성능을 높일 수 있으니,

한번 공부해보시면 좋을 것 같습니다.

 

완전탐색의 종류

 

1. Brute Force : for 문과 if 문을 사용하여 전체를 다 살펴보기

관련 예제: 프로그래머스 K번째 수 문제 https://datacodingschool.tistory.com/86

 

프로그래머스 - 'K번째수' 문제풀이

오늘도 하루에 코딩 문제 3문제 풀기에 도전한다. 프로그래머스에 Level 1에 있는 문제들은 조금만 생각하면 풀 수 있는 수준인 것 같다. 그 중에 K번째수를 찾는 문제는 제일 쉬운 문제 중에 하나�

datacodingschool.tistory.com

2. 비트마스크 : 용어 그대로 비트에 관한 것이다. 

비트(bit)는 0과1로 이루어진 컴퓨터에서 사용되는 최소 단위이다. (0,1 혹은 true,false 혹은 on,off)

관련 예제: 백준 2098번, 외판원 순회 문제 https://www.acmicpc.net/problem/2098

 

2098번: 외판원 순회

첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 16) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며, 갈 수 없는 경우는 0이 주어진다. W[i][j]는 도시 i에서 j

www.acmicpc.net

이진수 -> 십진수

십진수 - > 이진수 로 변환시키면서 문제를 풀 수 있다.

 

또한 이진수로 비트 변환 시킨 상태에서 다양한 비트 연산을 할 수 있다.

& (AND) : 대응하는 두 비트가 모두 1일 때 1반환

1010 & 1111 = 1010

| (OR) : 대응하는 두 비트 중 하나라도 1일 때 1반환

1010 | 1101 = 1111

^ (XOR) : 대응하는 두 비트가 서로 다를 때 1 반환

1010 ^ 1111 = 0101

~ (NOT) : 비트를 모두 반대 방향으로 뒤집는 변환

~1010 = 0101

>>, << (쉬프트 연산) : 왼쪽이나 오른쪽으로 비트를 옮긴다.

0001101 << 3 = 1101000
0001101 >> 2 = 0000011

 

참고한 블로그를 살펴보면,

왼쪽 시프트는 A * 2^B 를 의미하고, 오른쪽 시프트는 A / 2^B 를 의미한다.

0001 -> 0010 -> 0100 -> 1000 => 1, 2, 4, 8 .....

1000 -> 0100 -> 0010 -> 0001 => 8, 4, 2, 1 ..... 

(A + B) / 2 를 (A + B) >> 1 로 사용할 수도 있듯이 많은 곳에서 일반적인 사칙연산을 더 효율적으로 할 수 있다.


출처: https://mygumi.tistory.com/361 [마이구미의 HelloWorld]

 

 

3. 순열

순열(Permutation)은, 중복없이 원소들을 하나씩 뽑은 모든 경우의 수를 말한다.

예를 들어 {a,b,c,d}일 때, 2개를 뽑아서 일렬로 세우는 방법은 12가지

ab ac ad  ba bc bd  ca cb cd  da db dc 

경우의 수는 4*3 = 12이다.

 

4. 백트래킹

모든 경우의 수를 갈때, 비효율적인 루트는 차단하고, 가능성있는 곳을 탐색하는 알고리즘

관련 예제: 백준 9663 N-queen 문제, https://www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

5. BFS, DFS

넓이우선탐색(BFS) : 현재 정점에 연결된 가까운 점들부터 탐색

깊이우선탐색(DFS) : 현재 정점에서 최대한 갈 수 있는 점까지 들어가면서 탐색

관련 예제: 백준 2667 단지번호붙이기 문제, https://www.acmicpc.net/problem/2667

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. �

www.acmicpc.net

 

반응형
반응형

 

 

그렇게 복잡한 문제는 아니라고 생각했는데,

생각보다 시간을 많이 들인 것 같다.

 

그래도 차분하게 접근만 하면,

프로그래머스 Level 2정도도 금방 정복할 수 있을 것으로 예상!!

 

 

아래는 정답 코드이다.

def solution(skill, skill_trees):
    answer = 0
    arr = []
    
    for i in range(len(skill_trees)):
        check = 0
        check_ = 0
        for j in range(len(skill_trees[i])):
            if skill_trees[i][j] in skill:
                check_ += 1
                
            if skill_trees[i][j] == skill[check]:
                check += 1
                if check == len(skill):
                    break
                    
        if check_ == check:
            answer += 1
    
    return answer

 

 

혹시 코딩테스트가 어렵거나, 준비하는데 함께 공부하실 분들은

아래에 제가 올린 다양한 풀이 강의가 있으니 함께 공부해요~!!

 

https://www.youtube.com/channel/UCYYao-BSPaetw7N2GFFJ-Yw?view_as=subscriber

 

Henry Joo

 

www.youtube.com

 

반응형
반응형

 

오늘도 하루에 코딩 문제 3문제 풀기에 도전한다.

 

프로그래머스에 Level 1에 있는 문제들은 조금만 생각하면 풀 수 있는 수준인 것 같다.

 

그 중에 K번째수를 찾는 문제는 제일 쉬운 문제 중에 하나다.

 

문제를 푸는 목적을

자신이 할 수 있는 언어 문법을 공부한다고 생각하면 좋을 것 같다.

 

내가 푼 문제의 정답은 아래와 같다.

 

def solution(array, commands):
    answer = []
    
    for idx in range(len(commands)):
        i = commands[idx][0]
        j = commands[idx][1]
        k = commands[idx][2]
        answer.append(sorted(array[i-1:j])[k-1])
    
    return answer

 

코딩테스트 관련 문제들을 풀어놓은 강의를 하고 있다.

코딩테스트의 어려움이 있으신 분들은

다른 언어 대비 비교적 직관적이고 빠르게 배우기 쉬운 Python을 활용해서 연습을 해보면 좋을 것 같다.

 

https://www.youtube.com/channel/UCYYao-BSPaetw7N2GFFJ-Yw?view_as=subscriber

 

Henry Joo

 

www.youtube.com

 

반응형

+ Recent posts