Skip to content

Commit ad874e5

Browse files
authored
Merge pull request #2549 from hwi-middle/main
[hwi-middle] WEEK 07 solutions
2 parents 5776058 + 2161c19 commit ad874e5

5 files changed

Lines changed: 227 additions & 0 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int lengthOfLongestSubstring(string s) {
4+
int n = s.size();
5+
unordered_map<char, int> m; // 현재 윈도우 내에 있는 문자 - 인덱스
6+
int maxLen = 0;
7+
int l = 0;
8+
for (int r = 0; r < n; ++r)
9+
{
10+
if (m.contains(s[r])) // 중복된 문자를 찾은 경우
11+
{
12+
l = max(m[s[r]] + 1, l); // 해당 문자가 l보다 뒤에 있다면 l을 거기로 옮김
13+
}
14+
15+
m[s[r]] = r; // s[r]의 위치 업데이트
16+
17+
maxLen = max(maxLen, r - l + 1);
18+
}
19+
20+
return maxLen;
21+
}
22+
};

number-of-islands/hwi-middle.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class Solution {
2+
public:
3+
int numIslands(vector<vector<char>>& grid) {
4+
// BFS 기반 풀이
5+
int r = grid.size();
6+
int c = grid[0].size();
7+
8+
int cnt = 0;
9+
for (int i = 0; i < r; ++i)
10+
{
11+
for (int j = 0; j < c; ++j)
12+
{
13+
if (grid[i][j] == '0')
14+
{
15+
continue;
16+
}
17+
18+
cnt++;
19+
queue<pair<int, int>> q;
20+
q.push({i, j});
21+
grid[i][j] = '0'; // 방문 여부를 저장하기 위해 grid를 직접 수정
22+
23+
while (!q.empty())
24+
{
25+
int x, y;
26+
tie(x, y) = q.front();
27+
q.pop();
28+
29+
int dx[] = { 0, 1, 0, -1 };
30+
int dy[] = { 1, 0, -1, 0 };
31+
32+
for (int dir = 0; dir < 4; ++dir)
33+
{
34+
int nx = x + dx[dir];
35+
int ny = y + dy[dir];
36+
37+
if (nx < 0 || nx >= r || ny < 0 || ny >= c) continue;
38+
if (grid[nx][ny] == '0') continue;
39+
40+
grid[nx][ny] = '0';
41+
q.push({nx, ny});
42+
}
43+
}
44+
}
45+
}
46+
47+
return cnt;
48+
}
49+
};

reverse-linked-list/hwi-middle.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* struct ListNode {
4+
* int val;
5+
* ListNode *next;
6+
* ListNode() : val(0), next(nullptr) {}
7+
* ListNode(int x) : val(x), next(nullptr) {}
8+
* ListNode(int x, ListNode *next) : val(x), next(next) {}
9+
* };
10+
*/
11+
class Solution {
12+
public:
13+
ListNode* reverseList(ListNode* head) {
14+
ListNode* prev = nullptr;
15+
ListNode* cur = head;
16+
17+
// next를 이전 노드로 설정해나가며 루프
18+
while (cur != nullptr)
19+
{
20+
ListNode* tmp = cur->next;
21+
cur->next = prev;
22+
prev = cur;
23+
cur = tmp;
24+
}
25+
26+
return prev;
27+
}
28+
};

set-matrix-zeroes/hwi-middle.cpp

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
// 풀이 1
2+
class Solution {
3+
public:
4+
void setZeroes(vector<vector<int>>& matrix) {
5+
int m = matrix.size();
6+
int n = matrix[0].size();
7+
vector<pair<int, int>> v;
8+
v.reserve(m * n);
9+
10+
// 0인 칸을 별도의 공간에 마킹
11+
for (int i = 0; i < m; ++i)
12+
{
13+
for (int j = 0; j < n; ++j)
14+
{
15+
if (matrix[i][j] == 0)
16+
{
17+
v.push_back({i, j});
18+
}
19+
}
20+
}
21+
22+
// 마킹이 끝난 후 해당 칸들을 확인하며 행과 열을 채움
23+
for (auto coord : v)
24+
{
25+
int x = coord.first;
26+
int y = coord.second;
27+
28+
//
29+
for (int i = 0; i < n; ++i)
30+
{
31+
matrix[x][i] = 0;
32+
}
33+
34+
//
35+
for (int i = 0; i < m; ++i)
36+
{
37+
matrix[i][y] = 0;
38+
}
39+
}
40+
}
41+
};
42+
43+
// 풀이 2
44+
class Solution {
45+
public:
46+
void setZeroes(vector<vector<int>>& matrix) {
47+
int r = matrix.size();
48+
int c = matrix[0].size();
49+
50+
// 핵심 아이디어
51+
// - 각 행과 열에는 반드시 첫 번째 요소는 존재한다.
52+
// - 이를 활용하여 각 행과 열의 첫 번째 요소를 마킹용으로 사용한다.
53+
// - matrix[i][0]: i번째 행 전체를 0으로 만들어야 한다는 의미
54+
// - matrix[0][j]: j번째 열 전체를 0으로 만들어야 한다는 의미
55+
56+
// 엣지 케이스
57+
// - matrix[0][0]: 0번째 행인지, 0번째 열인지 구분할 수 없음
58+
59+
// 해결 방법
60+
// - matrix[0][0]은 0번째 행을 의미하도록 약속
61+
// - 0번째 열은 별도의 플래그를 둠
62+
63+
bool isFirstColZero = false;
64+
for (int i = 0; i < r; ++i)
65+
{
66+
if (matrix[i][0] == 0)
67+
{
68+
isFirstColZero = true;
69+
}
70+
71+
for (int j = 1; j < c; ++j)
72+
{
73+
if (matrix[i][j] == 0)
74+
{
75+
matrix[i][0] = 0;
76+
matrix[0][j] = 0;
77+
}
78+
}
79+
}
80+
81+
for (int i = 1; i < r; ++i)
82+
{
83+
for (int j = 1; j < c; ++j)
84+
{
85+
if (matrix[i][0] == 0 || matrix[0][j] == 0)
86+
{
87+
matrix[i][j] = 0;
88+
}
89+
}
90+
}
91+
92+
if (matrix[0][0] == 0)
93+
{
94+
for (int j = 0; j < c; j++)
95+
{
96+
matrix[0][j] = 0;
97+
}
98+
}
99+
100+
if (isFirstColZero)
101+
{
102+
for (int i = 0; i < r; i++)
103+
{
104+
matrix[i][0] = 0;
105+
}
106+
}
107+
}
108+
};

unique-paths/hwi-middle.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int uniquePaths(int m, int n) {
4+
// 결과 구하기: C(m + n - 2, m - 1)
5+
6+
int k = min(m - 1, n - 1); // C(n, k) = C(n, n - k)
7+
return combination(m + n - 2, k);
8+
}
9+
10+
int combination(int n, int k)
11+
{
12+
long long res = 1;
13+
for (int i = 1; i <= k; ++i)
14+
{
15+
res = res * (n - i + 1) / i;
16+
}
17+
18+
return res;
19+
}
20+
};

0 commit comments

Comments
 (0)