defareSimilar(a, b): if a == b: # 둘이 같으면 참 returnTrue else: # 다를 때 # 정렬한 값이 같은 경우, 스왑해야하는 갯수를 체크하면 된다 c = sorted(a) d = sorted(b) diffCount = 0 # 정렬한 값이 같은 경우 if c == d: for i in range(len(c)): if a[i] != b[i]: diffCount += 1 if diffCount > 2: returnFalse returnTrue # 정렬한 값이 다른 경우 else: returnFalse
if a == b: # 둘이 같으면 참 print("True") else: # 다를 때 # 정렬한 값이 같은 경우, 스왑해야하는 갯수를 체크하면 된다 c = sorted(a) d = sorted(b) diffCount = 0 # 정렬한 값이 같은 경우 if c == d: # 전체 길이만큼 보면서 for i in range(len(c)): # 원래 값에서 차이가 있는 갯수를 센다 if a[i] != b[i]: diffCount += 1 # 차이 값이 2개인 경우 한 번 스왑을 해서 해결할 수 있지만, 그 이상인 경우 한 번으로 해결 불가능 if diffCount > 2: print("False") break print("True") # 정렬한 값이 다른 경우 else: print("False")
Several people are standing in a row and need to be divided into two teams. The first person goes into team 1, the second goes into team 2, the third goes into team 1 again, the fourth into team 2, and so on.
You are given an array of positive integers - the weights of the people. Return an array of two integers, where the first element is the total weight of team 1, and the second element is the total weight of team 2 after the division is complete.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
defalternatingSums(a): team1 = 0 team2 = 0 for i in range(len(a)): if i % 2 == 0: # 2로 나눈 나머지가 0인 경우 team1 += a[i] else: # 2로 나눈 나머지가 1인 경우 team2 += a[i]
# 테스트 케이스 출력해보기 print(picture) # 첫 단어의 사이즈 확인해보기 print(picture[0]) # string 자료형의 경우 문자열을 더하여 문자열을 늘릴 수 있음 print("*" + picture[0] + "*")
# 위 아래 테두리 형태 만들기 border = "*"*(len(picture[0])+2)
# 기존 단어에 테두리 추가하기 for i in range(len(picture)): picture[i] = "*"+picture[i]+"*" # 테두리가 추가된 입력에 위아래 테두리 추가하기 picture.insert(0,border) picture.append(border)
Write a function that reverses characters in (possibly nested) parentheses in the input string.
Input strings will always be well-formed with matching ()s.
1 2 3 4 5 6 7 8 9 10
defreverseInParentheses(inputString): #[출처] [python] codeSignal 문제풀이 (13~15)|작성자 Jun s = inputString
while'('in s : #괄호가 다 없어질때까지 반복 fb = s.rfind('(') # rfind : 뒤에서부터 문자열 탐색 bb = s[fb:].find(')') #find : 앞에서부터 문자열 탐색 s = s[:fb] + s[fb+1:fb+bb][::-1] + s[fb+bb+1:] #부분적으로 슬라이스 가능
return s
문제를 못 풀겠어서 코드파이트 같이하는 오픈카톡방 방장님의 코드를 이용했음 처음에는 스택을 이용해서 접근하면 어떨까 고민하고 머리를 굴려봤는데, 괄호 안에 괄호가 반복되는 경우를 어떻게 처리해야할지 감이 하나도 오질 않았다. 그렇다고 다른 방법이 떠오르지 않아서 작성해두신 답을 그대로 이용했다.
이용한 답을 보니 while 뒤에 ‘(‘ in s 와 같은 문법을 이용할 수 있다는 것을 알게 되었다.
Some people are standing in a row in a park. There are trees between them which cannot be moved. Your task is to rearrange the people by their heights in a non-descending order without moving the trees. People can be very tall!
for i in range(len(a)): if a[i] == -1: IdxSet_minus1.append(i)
b = sorted(a) for i in range(len(IdxSet_minus1)): b.pop(0)
for i in range(len(a)): if cnt_minus1 < len(IdxSet_minus1): if i == IdxSet_minus1[cnt_minus1]: sort_a.append(-1) cnt_minus1 += 1 else: sort_a.append(b[cnt_sort]) cnt_sort += 1 else: sort_a.append(b[cnt_sort]) cnt_sort += 1
# 테스트 케이스 a = [-1, 150, 190, 170, -1, -1, 160, 180]
# -1인 인덱스를 저장할 공간 IdxSet_minus1 = []
# 새롭게 정렬한 값을 넣어줄 공간 sort_a = []
# 두 가지의 행렬을 비교해서 값을 넣을 것이기 때문에, 각 값의 인덱스 cnt_minus1 = 0 cnt_sort = 0
# '-1' 이 들어있는 위치의 인덱스를 모으기 for i in range(len(a)): if a[i] == -1: IdxSet_minus1.append(i)
# 주어진 케이스를 오름차순으로 정렬 b = sorted(a)
# 정렬한 케이스에서 -1 값 빼내기 for i in range(len(IdxSet_minus1)): b.pop(0)
# 배열의 전체 길이만큼 반복 for i in range(len(a)): # 만약, 넣어야하는 -1 이 남아있는 경우 if cnt_minus1 < len(IdxSet_minus1): # 찾아둔 -1 의 인덱스 값인 경우 if i == IdxSet_minus1[cnt_minus1]: sort_a.append(-1) cnt_minus1 += 1 # 찾아둔 -1 의 인덱스 값이 아닌 경우 else: sort_a.append(b[cnt_sort]) cnt_sort += 1 # -1 이 더이상 없는 경우 else: sort_a.append(b[cnt_sort]) cnt_sort += 1
Ticket numbers usually consist of an even number of digits. A ticket number is considered lucky if the sum of the first half of the digits is equal to the sum of the second half.
Given a ticket number n, determine if it’s lucky or not.
for i in range(len(n_list)): if i < len(n_list)/2: sumFront += int(n_list[i]) print(int(n_list[i])) else: sumSecond += int(n_list[i]) print(int(n_list[i]))
if sumFront == sumSecond: returnTrue else: returnFalse
# 붙어있는 숫자를 앞과 뒤로 분리해야하기 때문에, 쪼개는 방법을 생각하던 중 입력으로 받은 수를 string으로 변환 n_str = str(n)
# string으로 변환한 입력을 list로 바꾸면 list로 다룰 수 있게 됨 n_list = list(n_str)
# 앞의 합과 뒤의 합 sumFront = 0 sumSecond = 0
# 전체 리스트의 값을 순회하기 for i in range(len(n_list)): # 앞의 반일 경우 if i < len(n_list)/2: sumFront += int(n_list[i]) print(int(n_list[i])) # 뒤의 반일 경우 else: sumSecond += int(n_list[i]) print(int(n_list[i]))
# 값 비교 if sumFront == sumSecond: returnTrue else: returnFalse
if len(s3) >= len(s4): for i in range(len(s4)): Character = s4[i] try: Idx = s3.index(Character) except: pass else: save.append(s3.pop(Idx)) else: for i in range(len(s3)): Character = s3[i] try: Idx = s4.index(Character) except: pass else: save.append(s4.pop(Idx))
# 뒤에서 인덱스 찾고 pop 할 때 str형은 pop을 할 수 없어서 list 처리를 해주는 부분 s3 = list(s1) s4 = list(s2)
save = list() # 알고리즘 # 두 입력 중 길이가 짧은 녀석을 먼저 찾는다. # 짧은 녀석의 길이로 반복을 한다 # 짧은 녀석의 첫 값을 확인한다. # 긴 녀석에서 해당 값을 찾아서 pop 하고, 이를 다른 리스트에 저장한다. if len(s1) >= len(s2): for i in range(len(s2)): Character = s2[i] try: Idx = s3.index(Character) except: pass else: save.append(s3.pop(Idx)) else: for i in range(len(s1)): Character = s1[i] try: Idx = s4.index(Character) except: pass else: save.append(s4.pop(Idx))
#include<stdio.h> #include<stdlib.h> // qsort 함수가 선언된 헤더 파일
intcompare(constvoid *a, constvoid *b)// 오름차순 비교 함수 구현 { int num1 = *(int *)a; // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴 int num2 = *(int *)b; // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴
// 오름차순 정렬 조건 if (num1 < num2) // a가 b보다 작을 때는 return-1; // -1 반환 if (num1 > num2) // a가 b보다 클 때는 return1; // 1 반환 return0; // a와 b가 같을 때는 0 반환
// // 내림차순 정렬 조건 // if (num1 < num2) // a가 b보다 작을 때는 // return 1; // 1 반환 // if (num1 > num2) // a가 b보다 클 때는 // return -1; // -1 반환 // return 0; // a와 b가 같을 때는 0 반환 }
이 역시 구조체 변수의 모든 멤버가 매개변수로 복사되기 때문에, 구조체의 크기가 커질수록 비효율적인 방법이 된다. 따라서 포인터로 전달해주는게 메모리 관리 차원에서 더욱 효과적이다. 또한 이런 경우, 함수 내에서 구조체의 값을 변경하더라도 바깥의 구조체에는 영향을 끼치지 않는다.
#include<stdio.h> #include<string.h> // strcpy 함수가 선언된 헤더 파일
structPerson { char name[20]; int age; char address[100]; };
voidsetPerson(struct Person p)// 반환값 없음, 구조체 매개변수 한 개 지정 { // 매개변수로 받은 구조체 멤버의 값 변경 strcpy(p.name, "고길동"); p.age = 40; strcpy(p.address, "서울시 서초구 반포동"); }
#include<stdio.h> #include<string.h> // strcpy 함수가 선언된 헤더 파일
structPerson { char name[20]; int age; char address[100]; };
voidsetPerson(struct Person *p)// 반환값 없음, 구조체 포인터 매개변수 한 개 지정 { // 매개변수로 받은 포인터에서 구조체 멤버의 값 변경 strcpy(p->name, "고길동"); p->age = 40; strcpy(p->address, "서울시 서초구 반포동"); }
입력으로 들어오는 arr[]은 배열의 메모리 주소를 담고있는 포인터이기 때문에, 배열의 크기를 입력으로 넣어 주어야 한다. 특히 요소의 개수를 넣어줄 때, 배열의 크기 변화에 대응하기 위해서 sizeof 를 이용해야한다. 또한 arr[]로 입력(매개변수)를 지정한 경우 이는 포인터이기 때문에 배열의 요소를 변경하면 함수 바깥에 있는 배열의 값도 바뀌게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include<stdio.h>
voidsetElement(int arr[])// 배열의 포인터를 받음 { arr[2] = 300; // 매개변수로 받은 배열의 요소를 변경 }
// ↓ 배열의 가로 크기 지정 voidprint2DArray(int arr[][5], int col, int row)// 2차원 배열의 포인터와 가로, 세로 크기를 받음 { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf("%d ", arr[i][j]); }
voidprint2DArray(int (*arr)[5], int col, int row)// 매개변수를 포인터로 만든 뒤 가로 크기 지정 { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf("%d ", arr[i][j]); }
voidswapValue(void *ptr1, void *ptr2, enum TYPE t)// 반환값 없음, void 포인터 매개변수 두 개와 { // 변수의 자료형을 알려줄 열거형을 받음 switch (t) { case TYPE_CHAR: // 문자면 char *로 변환한 뒤 역참조하여 값을 서로 바꿈 { char temp; temp = *(char *)ptr1; *(char *)ptr1 = *(char *)ptr2; *(char *)ptr2 = temp; break; } case TYPE_INT: // 정수면 int *로 변환한 뒤 역참조하여 값을 서로 바꿈 { int temp; temp = *(int *)ptr1; *(int *)ptr1 = *(int *)ptr2; *(int *)ptr2 = temp; break; } case TYPE_FLOAT: // 실수면 float *로 변환한 뒤 역참조하여 값을 서로 바꿈 { float temp; temp = *(float *)ptr1; *(float *)ptr1 = *(float *)ptr2; *(float *)ptr2 = temp; break; } } }
intmain() { char c1 = 'a'; char c2 = 'b'; swapValue(&c1, &c2, TYPE_CHAR); // 변수의 메모리 주소와 TYPE_CHAR를 넣음 printf("%c %c\n", c1, c2); // b a: swapValue에 의해서 값이 서로 바뀜
int num1 = 10; int num2 = 20; swapValue(&num1, &num2, TYPE_INT); // 변수의 메모리 주소와 TYPE_INT를 넣음 printf("%d %d\n", num1, num2); // 20 10: swapValue에 의해서 값이 서로 바뀜
float num3 = 1.234567f; float num4 = 7.654321f; swapValue(&num3, &num4, TYPE_FLOAT); // 변수의 메모리 주소와 TYPE_FLOAT를 넣음 printf("%f %f\n", num3, num4); // 7.654321f 1.234567: // swapValue에 의해서 값이 서로 바뀜
return0; }
이중 포인터 매개변수 사용하기
포인터 매개변수를 이용해서 정수, 실수 등의 값 대신 포인터(메모리 주소)를 얻어오기 위한 방법이 필요!