Coding Test Practice

20개의 글

입출력과 사칙연산

2557번 (Hello World) 10718번 (We love kriii) 벡틱 안에서는 줄바꿈이 가능하다. 줄바꿈을 하는 다른 방법으로는 \n이 있다. 1000번 (A+B) 1001번 (A-B) 10998번 (AxB) 1008번 (A/B) 10869번 (사칙연산) 나눗셈은 Math.floor()를 이용하여 정수로 출력되도록 하였다. Math.floor()는 주어진 숫자보다 작거나 같은 정수 중 가장 가까운 정수를, Math.ceil()은 주어진 숫자보다 크거나 같은 정수 중 가장 가까운 정수를 반환한다. Math.round()는 주어진 숫자를 정수로 반올림한다. 10926번 (??!) 18108번 (1998년생인 내가 태국에서는 2541년생?!) 3003번 (킹, 퀸, 룩, 비숍, 나이트, 폰) 1043

2023. 03. 27.

조건문

1330번 (두 수 비교하기) 기본적인 조건문 문법을 사용해볼 수 있었다. 9498번 (시험 성적) AND 연산자(&&)를 사용해볼 수 있었다. 2753번 (윤년) OR 연산자를 사용해볼 수 있었다. 2884번 (알람 시계) .split(’ ‘)을 이용하여 input의 시와 분을 잘라 배열로 입력받았다. input의 시와 분을 각각 H와 M이라는 이름의 변수로 지정하면서 parseInt()를 통해 자료형을 숫자로 변환하였다. M이 45와 같거나 더 큰 경우와 45보다 작은 경우를 나누어서 조건문을 작성하였다. 그러나 H가 0인 경우 H-1은 -1이기 때문에 이 경우를 따로 지정하여 23으로 출력되게끔 하였다. 2525번 (오븐 시계) replace()를 이용하여 \n(줄바꿈)을 띄어쓰기로 대체했다. 그 후

2023. 03. 27.

반복문

2739번 (구구단) 이번에는 input 변수 자체를 parseInt함수로 묶어주었다. 반복문의 기본 문법을 이용했다. 벡틱 안에서 변수를 표현하고 싶은 경우 중괄호({})안에 넣고 그 앞에 $를 붙여주면 된다. 다른 방법으로는 input+” * “+i+” = “ 이런 식으로 표현하는 방법이 있다. 10950번 (A+B - 3) 줄바꿈이 많아 replace()가 아닌 replaceAll()을 사용했다. map()에 대해 더 정확히 이해하기 위해 위와 같은 방법으로도 써봤다. 반복문에서 i를 1씩 증가하지 않고 더 많이 증가시키려면 위와 같이 쓰면 된다. i가 2씩 증가하므로 input[0]에도 2를 곱해주었다. 8393번 (합) sum변수를 const가 아닌 let을 이용하여 지정한 이유는 반복문을 거치며

2023. 03. 27.

1차원 배열

10818번 (최소, 최대) split를 이용해 배열에 숫자들을 담고 Math.min과 Math.max를 이용해서 최솟값과 최댓값을 리턴받았다. 2562번 (최댓값) 이번에는 Math.max를 이용하지 않고 반복문을 통해 가장 큰 숫자를 찾아보았다. 가장 큰 숫자를 찾은 후에 배열에 indexOf를 이용하여 해당 숫자의 인덱스를 알아낸 후, 1을 더해주었다. 3052번 (나머지) map()을 이용하여 배열로 받은 input의 요소들에 42로 나눈 나머지를 구해주었다. 42로 나눈 나머지들로 구성된 배열의 중복을 Set()을 이용하여 제거했다. 중복을 제거한 배열의 길이를 출력했다. 1546번 (평균) 과목의 개수, 점수들의 배열, 가장 높은 점수 등을 먼저 변수로 만들어주었다. for문을 이용하여 문제에서

2023. 03. 27.

함수

4673번 (셀프 넘버) 우선 d() 함수를 만들었다. 숫자로 다루면 10000의 자리까지 생각해서 해야하기 때문에 문자로 만든 후 배열로 쪼갠 다음 다시 숫자로 만든 후에 reduce()를 이용하여 각 자리의 숫자를 모두 더해주었다. 이러한 방법으로 만의 자리 뿐 아니라 십만 백만으로 가도 쉽게 더할 수 있었다. 이 값을 numSum이라는 변수에 넣고 인수로 받을 num과 더해주었다. 빈 배열을 생성하고 거기에 0부터 10000까지(사실 계산해보면 꼭 10000까지의 숫자를 넣을 필요는 없었지만 일단 10000을 넣으면 0~10000까지의 생선된 숫자는 모두 반환받을 수 있을 것이라 생각했다.)의 숫자를 이용해 생성된 숫자들을 push()를 이용하여 담았다. 다시 한번 for문을 통해 0부터 10000까

2023. 03. 27.

문자열

11654번 (아스키 코드) charCodeAt() 함수 이용 11720번 (숫자의 합) for문을 이용하여 result라는 변수에 두번째 줄의 숫자들을 모두 더해주었다. i는 첫번째 줄의 숫자를 참조해서 상한을 정했다. 10809번 (알파벳 찾기) a~z는 아스키코드 97~122이다. 아스키코드를 통해 문자 a~z를 가져와서 result라는 빈 배열에 indexOf을 이용하여 인덱스 숫자를 담아준다. join()을 이용해 문제에서 제시한 출력 형식에 맞게 출력한다. 2675번 (문자열 반복) 반복해야 할 문자열을 arr2에 담았다. .repeat()함수를 이용하여 반복해주었고 두번째 for문 밖에 ‘\n’를 출력하여 줄바꿈을 해주었다. 1157번 (단어 공부) input을 모두 대문자로 변환한 다음, 배열

2023. 03. 27.

기본 수학 1

1712번 (손익분기점) fixedCost + (flexibleCost * BEP) = productPrice * BEP 가 될때가 손해도 이익도 없는 분기점이다. 이를 정리하면 BEP = fixedCost / (productPrice - flexibleCost)가 된다. 이는 손해도 이익도 없는 지점이므로 여기에 1개를 더 팔아야 이익이 시작된다. 따라서 답은 여기에 1을 더하고 소수점을 탈락시켜준다. 그러나 손익분기점이 없는 경우 -1로 나타내어야 한다. productPrice - flexibleCost가 음수이거나 0이면 이익이 나지 않아 손익분기점이 없으므로 이 경우는 -1을 출력하도록 한다. 2292번 (벌집) 1은 1층, 1에서 2개의 방을 지나가면 2층, 1에서 3개의 방을 지나가면 3층이라고

2023. 03. 27.

기본 수학 2

1978번 (소수 찾기) 소수는 1보다 큰 자연수 중 1과 자기자신만을 약수로 가지는 수이다. 바깥 for문은 주어진 모든 숫자를 연산하도록 한다. 안쪽 for문은 1부터 자기 자신까지 나머지가 0인 숫자를 기록하였다. 여기서 나머지가 0인 숫자가 2개이면 소수인 것으로, primeNum을 1 증가시켰다. primeNum을 출력하였다. 2581번 (소수) 1978번 문제와 마찬가지로 이중 for문을 통해 소수인지 확인하였다. 바깥쪽 for문은 min이상 max이하의 숫자들을 한번씩 연산하도록 하고, 안쪽 for문은 1부터 해당 숫자까지의 숫자로 나누어 나머지가 0이면 카운트한다. 카운트가 2보다 커지면 소수가 아니므로 멈춘다. 만약 카운트가 2이면 그 숫자는 소수이므로 primeArr에 push한다. 만약

2023. 03. 27.

2차원 배열

2738번 (행렬 덧셈) 행렬 덧셈 문제이다. matrixA와 matrixB를 선언하여 for문으로 해당 배열에 이중배열 형태로 행렬을 push해 주었다. 2중 for문을 이용해 각 위치 숫자끼리 더해주었다. trim()으로 정리 후 출력했다. 2566번 (최댓값) input을 한 줄씩 잘라 받는다. 또 다시 input의 인덱스 별로 띄어쓰기를 기준으로 잘라 arr에 push 한다. 2중 for문으로 모든 요소를 돌면서, max에 가장 큰 값을 기록한다. locationMax에는 그 위치를 기록한다. max와 locationMax를 출력한다. 2563번 (색종이) 우선 input으로 들어온 색종이가 붙은 위치를 2차원 배열로 정리한다. 이후 해당 색종이를 붙일 도화지를 생성한다. 도화지 배열은 100X100

2023. 03. 27.

정렬

2750번 (수 정렬하기) \n을 기준으로 배열로 잘라 담았을 때, 맨 앞 인덱스의 값은 input의 길이이므로 shift()로 없애주었다. 이후 .sort() 메소드를 이용하여 정렬하였다. for문을 통해 출력하였다. 2587번 (대표값2) sort()를 이용하여 배열로 받은 input을 정렬해준다. forEach문을 이용하여 배열 안 모든 값들을 average에 더해준다. average를 5로 나눈 값이 평균이므로 이를 5로 나누어 다시 average에 담는다. average를 출력한다. input 배열이 정렬되었으므로 5개 요소 중 3번째 인덱스가 중앙값이므로 input[2]를 출력해준다. 25305번 (커트라인) 첫째 줄의 학생 수와 수상자 수는 각각 N과 k로 받았다. 둘째 줄의 점수 리스트는 sc

2023. 03. 27.

재귀

10872번 (팩토리얼) n! = n * (n-1)! 이다. 이를 이용하여 재귀 함수를 이용해 구현했다. 자바스크립트로 재귀 함수를 구현해본 것은 처음이다. 문제가 복잡해지면 어려워질 것 같다. 간단하게 재귀함수와 반복문의 차이를 찾아봤는데 반복문이 시간, 메모리 면에서 더 효율적이지만 알고리즘 상 재귀함수를 사용하는 것이 더 자연스럽거나 코드의 길이를 확 줄일 수 있는 경우 재귀함수를 사용할 수 있다고 한다. 10870번 (피보나치 수 5) 재귀 함수의 형식에 익숙해지는 과정인 듯 하다. 재귀에서 중요한 것은 스택 오버플로우가 발생하지 않도록 탈출구를 잘 지정하는 것이다. 25501번 (재귀의 귀재) 재귀 함수를 수행하면 count가 1 증가하도록 하여 호출 횟수를 알아냈다. 이는 출력 후 다시 0으로 초

2023. 03. 27.

브루트 포스

2798번 (블랙잭) 브루트 포스 알고리즘이라고 해서 시간복잡도를 아예 신경 쓰지 않았는데 이렇게 해도 되나 싶은 마음이 든다(..) 3중 for문을 돌리고 같은 카드를 중복 선택할 수 없으므로 j를 돌릴 때에는 i와 같으면 스킵하고, k를 돌릴 때에는 i또는 j와 같으면 스킵했다. sum에 3가지 숫자의 합을 넣고 M에서 sum을 뺀 값이 현재 가장 적은 차이가 나는 dif의 값보다 작으면 dif를 갱신하고 정답에 해당 값을 넣어준다. 3가지 숫자의 합이 M을 넘으면 안되므로 만약 그럴 경우 sum을 0으로 만들어주었다. 2231번 (분해합) 역시나 브루트 포스 알고리즘이라서 for문을 통해 input부터 0까지 내려가며 탐색하였다. 만약 i 가 0이고 answer가 0이면 (생성자를 찾지 못했다는 뜻)

2023. 03. 27.

집합과 맵

10815번 (숫자 카드) 처음에는 배열로 처리해서 indexOf 메소드를 이용해 해결하려 했는데 시간초과가 됐다. 이후 문제의 의도에 따라 set객체를 이용해 해결했다. 삼항연산자를 위와 같이 활용하니까 코드가 깔끔해서 보기 좋았다. 14425번 (문자열 집합) input의 0~N 인덱스에 해당하는 문자열을 집합 S에 입력해준다. N ~ M 까지의 인덱스에 해당하는 문자열이 집합 S에 포함되는지 확인한다. 포함되면 answer를 +1 해준다. 1620번 (나는야 포켓몬 마스터 이다솜) Map을 이용해 도감의 포켓몬의 이름을 key로, 포켓몬의 번호를 value로 넣어주었다. 문제에 isNaN을 씌워서 숫자이면 배열에 인덱스를 이용하여 접근하고, 문자열이면 get을 이용하여 value에 있는 포켓몬 번호를

2023. 03. 27.

기하 1

1085번 (직사각형에서 탈출) 가로의 왼쪽, 오른쪽 중 짧은 거리를 widthMin에 넣고 세로의 위쪽, 아래쪽 중 짧은 거리르 heightMin에 넣었다. 둘 중 짧은 것을 출력하였다. 3009번 (네 번째 점) x좌표와 y좌표를 각각 다른 배열을 만들어 담는다. 중복되는 좌표를 제거했다. 각각 남은 좌표가 x와 y를 찍어야 할 위치이다.

2023. 03. 27.

스택

10828번 (스택) 스택에 대해 자료구조만 이해하고 있다면 풀 수 있는 문제였다. 여러 방법이 있지만 스택과 정답 배열을 만들어두고 정답배열에 push하며 진행하는 간단한 방법으로 해결했다. 10773번 (제로) 스택을 하나 만들고 마지막에 안에 있는 숫자들을 모두 answer 변수에 담아주었다. 9012번 (괄호) 스택이 꼭 배열일 필요는 없었다. 여는 괄호라면 +1을 해주고 닫는 괄호라면 -1을 해주었다. 닫는괄호가 등장했는데 스택이 0이면 이미 NO 이므로 NO를 넣어주었다. 안쪽 for문이 종료되고 만약 stack이 0이고 NO가 들어가있지 않은 상태면 YES를 넣어주었다. 나머지는 스택이 1이 아닌 것으므로 NO를 넣어주었다. 4949번 (균형잡인 세상) 풀리긴 했지만 하드코딩으로 푼 것 같아 마

2023. 04. 22.

큐, 덱

10845번 (큐) 큐를 배열로 만들고 정답을 넣어줄 answer 배열도 만들었다. 각각의 기능들을 push, shift를 이용해 구현했다. 2164번 (카드2) 배열로 queue를 구현할 경우 shift와 push를 이용해야 하는데, 이 과정에서 시간초과가 났다. 연결리스트를 이용하여 구현한다는 것을 보고 클래스를 이용해 구현했다. 각각의 노드는 그 값을 갖고, 이전 노드와 다음 노드에 연결된다. LinkedList에는 맨 첫번째 노드인 head와 맨 마지막 노드인 tail을 가진다. addNode()는 특정 값을 인자로 받아 그 값을 가진 Node를 만들고, 이를 LinkedList에 추가한다. 솔직히 클래스를 이용한 연결리스트 구현은 복잡하게 생각했었는데, 한번 구현해보고 나니 머릿속에 정리가 된 것

2023. 03. 27.

그리디

11047번 (동전 0) for문을 이용해 가장 큰 수 부터 K가 해당 코인보다 크다면 나누어주었다. 그 몫을 answer에 더하고, K는 나머지를 넣어주었다. 11399번 (ATM) 가장 작은 수부터 나열해야 합이 적기 때문에 정렬 후 이중 for문을 통해 더해주었다.

2023. 06. 06.

백트래킹

15649번 (N과 M (1)) output에 숫자를 넣어가면서 cnt가 M일 때 result에 이를 삽입한다. isVisited를 이용해서 output에 담겨있는 숫자를 확인하고 담겨있을 경우 continue로 스킵한다. output에 해당 숫자를 넣고 재귀로 dfs를 다시 호출한다. 다시 숫자를 제거하고 isVisited도 false로 해준다. 위 코드의 input이 [4, 2]일 때 dfs함수의 최상단에서 각 변수를 디버깅하면 아래와 같다. 15650번 (N과 M (2)) 여기서는 순열이 아닌 조합을 찾아야 하므로 15649문제에서 가공했다. 중복을 제거하고, 오름차순으로 만들기 위해 각 숫자들을 숫자형으로 바꾸고, sort()한 후 다시 문자열로 합쳤다. 이후 중복을 제거했다. 15651번 (N과 M

2023. 05. 29.

DP

9184번 (신나는 함수 실행) 먼저 메모할 3중 배열을 만든다. 재귀함수를 작성하는데, 정답을 계산하면 memo 배열에 메모한다. 만약 memo[a][b][c]가 존재한다면 이를 출력한다. 없다면 계산한다.

2023. 06. 08.

1927번 (최소 힙) insert 메소드와 delete 메소드는 각각 삽입, 삭제 후 느슨한 정렬상태가 되도록 한다. input이 0보다 크면 insert를 하고, 그게 아니면 delete가 리턴한 값을 정답 배열에 push한다. input이 0이고 heap에 아무것도 없을 경우 delete 메소드는 0을 리턴한다.

2023. 07. 04.