SW마에스트로 1차 코테 복기

seon·2024년 2월 24일

Algorithm

목록 보기
34/41
post-thumbnail

프로그래머스로 치뤄졌음.

1. 교통비 문제

  • std : 기준거리
  • base_cost: 기본값
  • dists: 이동거리 리스트
def solution(std, base_cost, dists):
	answer = []
    for i in dists:
      if std >= i:
          answer.append(base_cost)
      else:
          answer.append(base_cost+(i-std)*1000)
    return answer

입출력 예시)
std = 5
base_cost = 3000
dists = [3, 5, 7]

result: [3000, 3000, 5000]

2. 지그재그 문제

n값에 대하여 만들어진 사각형은
가로길이 1, 세로길이 2인 사각형 n개가 모여 만들어진 사각형으로,
전체 사각형의 윗변은 1부터 n+1번 꼭지점으로 이루어져 있으며, 아랫변은 n+2번부터 n+n+2번 꼭지점으로 이루어져 있다.
1번 꼭지점에서 출발하여 각 꼭지점을 지그재그로 이동하여 n+1번 꼭지점에 도달할 때 만들어지는 삼각형의 넓이들을 오름차순으로 정렬하는 문제였다.

def solution(n, 지그재그하며 이동한 꼭지점 순서 리스트 points):
	answer = []
    if points[1] != n+2:
    	answer.append(points[1] - (n+2))
    if points[-2] != 2*n+2:
    	answer.append(2*n+2-points[-2])
    for i in range(len(points)-2):
    	answer.append(points[i+2] - points[i])
    answer.sort()
    return answer

만들어지는 삼각형들의 높이가 모두 사각형 세로길이인 2였으므로, 삼각형들의 밑변 길이가 곧 그 삼각형의 넓이였다. 따라서 points 리스트의 1칸씩 떨어져있는 꼭지점 번호들의 차이가 밑변 길이가 되었다.
단 아랫변의 points 중 첫번째와 마지막 꼭지점은, 양끝 꼭지점이 아닐 경우,
삼각형이 추가로 만들어지므로 이 조건을 생각해주어야 했다.

3. html 태그 id, class 속성의 텍스트 크기 구하기

알고리즘 문제였는데,
우선순위에 따라 텍스트 크기를 구하는 문제였다.

예시 입출력

#1

  • text : [["f 1 2 3"], ["d 3 10"]]
  • commands: [[".3", "12"], ["#f", "99"], [".3", "7"]]
  • result: [7, 99]

#2

  • text: ["

command에 따라 text에 주어진 각 id별 폰트 크기를 사전식 id 순으로 출력해야 했는데,
1.id가 있다면 class 속성의 커멘드는 따를 필요 없이 그 id의 텍스트 크기가 유지된다. => id가 f라면, 텍스트 크기는 99이다. ("#f", "99" 커멘드 때문)
2. id가 없다면 뒤의 class 속성의 커멘드에 따라 텍스트 크기가 정해진다. 같은 class의 커멘드가 존재할 경우 나중 커멘드를 따른다. -> id가 d라면, 커멘드에 d에 대한 것이 없기 때문에 d의 class 중 3에 대한 커멘드를 따른다. (".3", "12"와 ".3", "7" 중 나중 것)에 따라 텍스트 크기는 7이다.
3. 만약 우선순위가 같다면, 마지막 것을 따르라고 되어 있었던 것 같다.(불확실)

def solution(text,commands):
	answer = [0]*(len(text))
    id = []
    text.sort #id 순으로 출력해야 하므로
    for i in text:
    	id.append(i[0])
    for i in id:
    	for j in commands:
    		if j[0][1] == i:
            	answer[id.index(i)] = j[1]
            else:
            	for k in i[2:]:
                	if k == j[0][1]:
                    	answer[id.index(i)] = j[1]
    return answer

잘 안짜져서 포기하려던 와중 그래도 한번 해보자 하고 막판에 for문을 많이 써서 어떻게 해볼려다가 시간이 없어서 더 생각하지 못했다.. 위 코드로 돌려보니까 주어진 3개의 테스트 케이스 중 1개만 맞고 나머지는 잘 안나왔다.
위의 입출력의 경우 [99,99]로 나왔고([7,99]로 나와야 하는데), 두번째의 경우 [0,16,9]로, 0이 나오면 안되는데 나와서 틀렸던 것 같다. 세번째는 [22,22]가 나와서 우연히 맞았다.

4. n으로 나눈 나머지와 인덱스가 같은 경우가 많게 정렬하기

def solution(길이가 n인 리스트):
	answer = [[] for i in range(len(list))]
    for i in list:
    	for j in range(len(list)):
        	if i%7 == j:
            	answer[i].append(j)
    ## 모르겠다..
    return answer

예시 입출력

#1

  • list : [2, 5, 6, 13, 14, 16, 35]
  • result : [14, 2, 16, 6, 35, 5, 13]

#2

  • list: [1, 2, 11, 21, 26, 35, 37, 58, 98, 105]
  • result: [11, 1, 2, 21, 98, 35, 26, 37, 58, 105]

n=7이고 인덱스가 0부터 6까지인 경우인데,
리스트의 수들 중 n으로 나눈 나머지가 인덱스와 같도록 할 때,
가장 많은 수들이 그렇게 되는 경우는 위와 같다. 7로 나눈 나머지가 0 또는 2 또는 5 또는 6이므로 가장 많은 경우는 4개이다.

나머지가 같은 경우 사전식 배열을 한다.
예를 들어 [3,4,2] 와 [3,4,6] 중 더 앞선 배열은 [3,4,2]가 되는 것이다.

5. SQL 문제

SELECT COUNT(C_ID) AS CNT
FROMGROUP BY PROGRAMMING_LNG
ORDER BY CNT LIMIT 1

소마에서 각 프로그래밍 언어별로 사람을 하나씩 모아 팀을 구성하려고 할 때 만들어질 수 있는 최대 팀 수를 구하는 문제였다.
우선 프로그래밍 언어별로 존재하는 사람 수를 모으고, 한 팀에 모든 프로그래밍 언어가 들어가야 하므로 가장 작은 수의 사람이 존재하는 프로그래밍 언어의 사람 수를 출력해야 했다. 컬럼 이름은 CNT 로 해야 했다.

소감

주어진 테스트 케이스 이외에 특별한 경우도 되는지 체크를 해보고 싶었는데 시간이 모자랐다.. 1,2,5번 문제는 확실히 푼 것 같은데 예외 사항에서도 맞았을지.. 주어진 테스트케이스만 다 맞혔다고 해서 제출한 후 다른 케이스에 대해서 통과됐는지 실패했는지는 확인할 수는 없었다. 점수도 안 알려준다고 한다. 그래서 불합 여부는 예측할 수 없지만, 최대 3.5솔까지 했다고 가정하면 승산 있지 않을까>< 작년에는 2-3솔 푼 사람도 통과됐다고 하니.. 2차 코테를 준비하며 기다려보아야겠다.

결과

결과적으론? 떨어졌다ㅎ 사실 어찌보면 당연한 결과다~
오픈채팅방의 합격자들은 거의 올솔해야했던 것 같다(내 기억으론)
첫 코딩테스트였던만큼 많이 떨었고, 대부분 사람들보다 준비 기간은 짧았지만 그래도 나름 열심히 했어서 아쉬웠던 것 같다. 코테 어떻게 하는지 유튜브도 찾아보고, 백준 브론즈~실버1까지 풀어보고, 예전 합격자 후기도 다 찾아보고.. 등등..
그래도 어떤 부분이 부족한지 확실하게 알 수 있었고, 내가 1-2달 동안 준비한 것들이 다 실제로 쓰이는 게 신기했다. 이런식으로 하는 거구나 경험치를 쌓은 것만으로도 매우 만족한다 사실.
더 철저하게 준비해서,, 백준 골드까지 풀고, 알고리즘 종류별로 완벽하게..!ㅋㅋ
다음엔 꼭 합격하자..!

그리고 저는 5개월 뒤에 네이버 부캠에 합격하게 됩니당...🥹

profile
🌻

0개의 댓글